Linux shell指令碼語法筆記(三):參數和輸入輸出

2020-08-09 22:57:37

沒有學不會的技術

01 位置參數和特殊變數

1 位置參數和特殊變數:$**

$0 相當於C語言main函數的argv[0],表示指令碼本身檔名稱

$1、$2 相當於C語言main函數的argv[1]、argv[2]…,表示指令碼檔名後的第1…個參數

$# 相當於C語言main函數的argc -1,表示參數個數

$@ 表示所有參數列表

$* 表示所有參數列表

$? 表示上一條命令的Exit Status

$$ 表示當前進程號,指令碼執行時的PID

shift n 表示位置參數左移,如shift 2 表示$1、$2丟棄,後續的位置參數變成$1、$2…

綜合範例:

建立argv.sh檔案,輸入如下內容:

echo "第一個參數:"
echo $1

echo "第二個參數:" 
echo $2

echo "第三個參數:"
echo $3

echo "參數總個數:"
echo $#

echo "所有參數:"
echo $@

shift 2

echo "所有參數:"
echo $*

echo "上一條命令的執行狀態:"
echo $?

echo "當前進程號:"
echo $$

在終端執行可執行檔案,檢視輸出結果:

lihoon@lihoon:~/code/Linux_shell$ ./argv.sh aa bb cc dd ee ff
指令碼名稱
./argv.sh
第一個參數:
aa
第二個參數:
bb
第三個參數:
cc
參數總個數:
6
所有參數:
aa bb cc dd ee ff
所有參數:
cc dd ee ff
上一條命令的執行狀態:
0
當前進程號:
10084

02 輸入輸出

2 echo——顯示文字行或者變數:echo [option] string

-e——解析跳脫字元

-n——不回車換號(預設情況下,echo的內容後面會跟一個回車換行)

lihoon@lihoon:~/code/Linux_shell$ echo "hello\n\n"
hello\n\n
lihoon@lihoon:~/code/Linux_shell$ echo -e "hello\n\n"
hello


lihoon@lihoon:~/code/Linux_shell$ echo -n "hello"
hellolihoon@lihoon:~/code/Linux_shell$ 

3 printf——列印文字:printf string

hellolihoon@lihoon:~/code/Linux_shell$ printf "hello\n"
hello

4 管道:通過 | 把一個命令的輸出傳遞給另一個命令做輸入

lihoon@lihoon:~/code/Linux_shell$ ls -l | grep "argv.sh"
-rwxrw-r-- 1 lihoon lihoon  327 8月   9 21:11 argv.sh

5 tee——把結果輸出到標準輸出,另一個符文輸出到相應的檔案

-a——在原來輸出檔案的基礎上追加其他輸出

lihoon@lihoon:~/code/Linux_shell$ df -k | awk '{print $1}' |grep -v "檔案系統" | tee a.txt
udev
tmpfs
/dev/nvme0n1p6
tmpfs
tmpfs
tmpfs
/dev/loop2
/dev/nvme0n1p4
/dev/nvme0n1p7
/dev/nvme0n1p1
/dev/loop17
tmpfs
tmpfs
/dev/sda1

lihoon@lihoon:~/code/Linux_shell$ cat a.txt 
udev
tmpfs
/dev/nvme0n1p6
tmpfs
tmpfs
tmpfs
/dev/loop2
/dev/nvme0n1p4
/dev/nvme0n1p7
/dev/nvme0n1p1
/dev/loop17
tmpfs
tmpfs
/dev/sda1

6 檔案重定向

cmd > file 把標準輸出重定向到新檔案中

cmd >> file 把標註輸出追加到原來的檔案中

cmd > file 2 > &1 把標準出錯重定向到檔案中

cmd >> file 2 > &1 把標準出錯追加到檔案中

cmd < file1 > file2 把輸入輸出都定向到檔案裡

cmd < &fd 把檔案描述符fd作爲標準輸入

cmd > &fd 把檔案描述符fd作爲標準輸出

cmd < &- 關閉標準輸入

# 重定向
lihoon@lihoon:~/code/Linux_shell$ date > file1
lihoon@lihoon:~/code/Linux_shell$ cat file1
2020年 08月 09日 星期日 22:23:09 CST

# 追加重定向
lihoon@lihoon:~/code/Linux_shell$ ls >> file1
lihoon@lihoon:~/code/Linux_shell$ cat file1
2020年 08月 09日 星期日 22:23:09 CST
argv.sh
a.txt
command.sh
file1
for.sh
f.sh
note.txt
out
sample.sh
shell筆記1.md
Shell筆記2.md
Shell筆記3.md
temp
temp.sh
temp.txt
while.sh

# 標準錯誤重定向
lihoon@lihoon:~/code/Linux_shell$ date -t > file1 2>&1
lihoon@lihoon:~/code/Linux_shell$ cat file1 
date: 不適用的選項 -- t
Try 'date --help' for more information.

# 輸入輸出都重定向
lihoon@lihoon:~/code/Linux_shell$ cat < file1 > file2
lihoon@lihoon:~/code/Linux_shell$ cat file2
date: 不適用的選項 -- t
Try 'date --help' for more information.

安得廣廈千萬間