shell語法的一些知識和練習,可以當作筆記收藏一下!!
文章目錄
前言
一、shell
二、shell語法
1.文件重定向
?2.引入外部腳本
?3.作業
總結
前言
shell語法的一些知識和練習,可以當作筆記收藏一下!!
提示:以下是本篇文章正文內容,下面案例可供參考
一、shell
hell是我們通過命令行與操作系統溝通的語言。
shell腳本可以直接在命令行中執行,也可以將一套邏輯組織成一個文件,方便復用。
AC Terminal中的命令行可以看成是一個“shell腳本在逐行執行”。
Linux中常見的shell腳本有很多種,常見的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
zsh
…
Linux系統中一般默認使用bash,所以接下來講解bash中的語法。
文件開頭需要寫#! /bin/bash,指明bash為腳本解釋器。
二、shell語法
1.文件重定向
每個進程默認打開3個文件描述符:
- stdin標準輸入,從命令行讀取數據,文件描述符為0
- stdout標準輸出,向命令行輸出數據,文件描述符為1
- stderr標準錯誤輸出,向命令行輸出數據,文件描述符為2
可以用文件重定向將這三個文件重定向到其他文件中。
重定向命令列表
命令 | ?? ?說明 |
command > file | 將stdout重定向到file中 |
command < file | 將stdin重定向到file中 |
command >> file | 將stdout以追加方式重定向到file中 |
command n> file | 將文件描述符n重定向到file中 |
command n>> file | 將文件描述符n以追加方式重定向到file中 |
輸入和輸出重定向:
echo "World" >> output.txt # 將字符串追加到output.txt中read str < output.txt # 從output.txt中讀取字符串echo $str # 輸出結果:Hello World
同時重定向stdin和stdout
創建bash腳本:?
#! /bin/bashread a
read becho $(expr "$a" + "$b")
創建input.txt,里面的內容為:
3
4
acs@9e0ebfcd82d7:~$ chmod +x test.sh # 添加可執行權限
acs@9e0ebfcd82d7:~$ ./test.sh < input.txt > output.txt # 從input.txt中讀取內容,將輸出寫入output.txt中
acs@9e0ebfcd82d7:~$ cat output.txt # 查看output.txt中的內容
7
?2.引入外部腳本
類似于C/C++中的include操作,bash也可以引入其他文件中的代碼。
語法格式:
. filename # 注意點和文件名之間有一個空格或source filename
示例
創建test1.sh,內容為:
#! /bin/bashname=yxc # 定義變量name
?然后創建test2.sh,內容為:
#! /bin/bashsource test1.sh # 或 . test1.shecho My name is: $name # 可以使用test1.sh中的變量
執行命令:
acs@9e0ebfcd82d7:~$ chmod +x test2.sh
acs@9e0ebfcd82d7:~$ ./test2.sh
My name is: yxc
?3.作業
創建好作業后,先進入文件夾/home/acs/homework/lesson_3/,然后:
(0) 進入homework_0文件夾,編寫自動完成lesson_1作業的腳本helper.sh。要求:
? ? [1] 當前目錄下僅包含helper.sh
? ? [2] helper.sh具有可執行權限
?
(1) 進入homework_1文件夾,編寫腳本check_file.sh。要求:
? ? [1] 當前目錄下僅包含check_file.sh。
? ? [2] check_file.sh具有可執行權限。
? ? [3] check_file.sh接收一個傳入參數。格式為 ./check_file.sh file
? ? [4] 判斷傳遞參數,分別在標準輸出中輸出如下內容(不包括雙引號):
? ? ? ? 1) 如果傳入參數個數不是1,則輸出一行:"arguments not valid",然后退出,退出狀態等于1。
? ? ? ? 2) 如果file文件不存在,則輸出一行:"not exist",然后退出,退出狀態等于2。
? ? ? ? 3) 如果file文件存在,則輸出分別進行如下5個判斷,然后退出,退出狀態等于0。
? ? ? ? ? ? 1] 如果file為普通文件,則輸出一行:"regular file"
? ? ? ? ? ? 2] 如果file為目錄(文件夾),則輸出一行:"directory"
? ? ? ? ? ? 3] 如果file具有可讀權限,則輸出一行:"readable"
? ? ? ? ? ? 4] 如果file具有可寫權限,則輸出一行:"writable"
? ? ? ? ? ? 5] 如果file具有可執行權限,則輸出一行:"executable"
(2) 進入homework_2文件夾,編寫腳本main.sh。要求:
? ? [1] 當前目錄下僅包含main.sh
? ? [2] main.sh具有可執行權限
? ? [3] 該文件從stdin(標準輸入)中讀取一個整數n
? ? [4] 在stdout(標準輸出)輸出斐波那契數列的第n項。即:a[0] = 1, a[1] = 1, a[i] = a[i - 1] + a[i - 2], 求a[n]。
? ? [5] 數據保證 0 <= n <= 20,腳本不需要判斷n的合法性。
(3) 進入homework_3文件夾,編寫腳本main.sh。要求:
? ? [1] 當前目錄下僅包含main.sh
? ? [2] main.sh具有可執行權限
? ? [3] 該文件從stdin(標準輸入)中讀取兩行整數n和m
? ? [4] 在stdout(標準輸出)中輸出1~n的按字典序從小到大的順序數第m個全排列,輸出一行,用空格隔開所有數,行末可以有多余空格。
? ? [5] 數據保證 1 <= n <= 10, 1 <= m <= min(100, n!),腳本不需要判斷數據的合法性。
?
?
#! /bin/bashread n
read m#:<<EOF
for (( i = 1; i <= n; i ++ ))
dost[$i]=0p[$i]=0
donedfs(){if [ $1 -eq $n ]thenm=$(expr $m - 1)if [ $m -eq 0 ]thenfor (( i = 0; i < n; i ++ ))doecho -e "${p[$i]} \c"doneecho ''return 0fireturn 1filocal j=0for (( j = 1; j <= n; j ++ ))doif [ ${st[$j]} -eq 0 ]thenp[$1]=$jst[$j]=1#x=$(expr $1 + 1)if dfs $(expr $1 + 1)thenreturn 0fist[$j]=0fidonereturn 1
}
dfs 0
#EOF
(4) 進入homework_4文件夾,編寫腳本main.sh。要求:
? ? [1] 當前目錄下僅包含main.sh
? ? [2] main.sh具有可執行權限
? ? [3] main.sh接收兩個傳入參數。格式為 ./main.sh input_file output_file
? ? [4] 從input_file中讀取一個正整數n,然后將前n個正整數的平方和寫入output_file中
? ? [5] 數據保證 1 <= n <= 100,腳本不需要判斷所有數據的合法性。
#! /bin/bash:<<EOF
input_file=$1
output_file=$2
EOF#read n < $input_file
read n < $1
sum=0for (( i = 1; i <= n; i ++ ))
dosqr=$(expr $i \* $i)sum=$(expr $sum + $sqr)
done#echo $sum > $output_file
echo $sum > $2
總結
上述是shell語法的一些知識和練習,可以當作筆記收藏一下!!