目錄
概述
Shell從誕生之初,就和普通的PC用戶無緣了,工程師應該會喜歡Shell,maybe是這個樣子的。
shell 提供了你和操作系統Linux之間的通訊方式。
shell的工作方式有兩種
-
REPL
-
寫成腳本(命令集合),然後在執行
你在終端寫出的shell命令,計算機是無法直接理解的,需要shell解釋器來完成翻譯工作,shell解釋器有多種,使用如下的命令來查看當前機器有哪些shell
cat /etc/shells
執行腳本的方式
-
bash + 腳本的相對或者是絕對路徑:bash解釋器幫助你執行腳本,並不需要執行權限
-
./**.sh 腳本自己執行(當前腳本需要可執行,也即需要執行權限)
變量
關於用戶自定義變量,比較需要注意的地方:
- 變量名=變量值(等號兩邊不要有空格,這個我喫過大虧)
- 獲取變量值:$變量名
- 撤銷變量:unset 變量名
重要:但凡腳本定義變量的時候,不帶$,再次使用的時候都需要添加$
變量的獲取
-
$1, $2, $x 獲取第一/二/x個參數
-
$# 獲取參數的個數
-
$* 獲取所有參數,參數是一個整體
-
$@ 獲取所有參數,每個參數區分對待
下面舉個例子說明下$* 和$@
[pyd@pydServer pyd-electrician-app_apollo]$ bash test.sh 1 2 3
1 2 3
1
2
3
[pyd@pydServer pyd-electrician-app_apollo]$ cat test.sh
#/bin/bash
for i in "$*"
do
echo "$i"
done
for i in "$@"
do
echo "$i"
done
強調一點,在日常寫shell腳本的時候,如果獲取變量要養成添加 "" 的習慣,""能夠獲取變量值,即便不寫也是OK的,如果能夠獲取到變量,vim能夠表現出特定的顏色,但是添加""是一個好的習慣。
變量的獲取中:
-
單引號不獲取變量值
-
雙引號獲取變量值
-
嵌套中,雙引號中的單引號可以取值,反之不行
-
反引號執行反引號中的命令
具體看下面的示例
[pyd@pydServer pyd-electrician-app_apollo]$ bash test.sh 2019
$command
2019
'2019'
"$command"
2020年 01月 09日 星期四 00:26:08 CST
[pyd@pydServer pyd-electrician-app_apollo]$ cat test.sh
#/bin/bash
command=$1
echo '$command'
echo "$command"
echo "'$command'"
echo '"$command"'
echo `date`
ps:如果不添加echo,解釋器會認爲每一行是一句命令。其實,解釋器認爲每一行都是命令。
數據運算在shell中:"$((運算式))" 或者是 "$[()]" 這裏尤其是"" 和 $
[pyd@pydServer pyd-electrician-app_apollo]$ a="$((1+2))"
[pyd@pydServer pyd-electrician-app_apollo]$ echo "$a"
3
常用 (vim + awk)
介紹幾個有用的vim模式中非常有用的快捷鍵:
-
a 當前光標的下一個
-
o 當前光標的下一行
-
i 當前光標
-
shift + g 最後一行
-
shift + 4 光標所在行的最後一個字符
-
:x 定位第x行
-
:/xxx 搜索xxx
兩個有用的系統函數
-
basename
-
dirname
作用如下:
[root@hadoop102 shell]# basename /root/shell/if.sh
if.sh
[root@hadoop102 shell]# dirname /root/shell/if.sh
/root/shell
shell的文本分析工具有cut、sed、最強大的就是awk,具體說說awk,awk是貝爾實驗室在77年搞出來的文本編輯神器,這個強大的文本分析工具,把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行分析處理。cut能實現的,AWK都能實現。基本用法:awk [選項參數] ‘pattern1{action1} pattern2{action2}...’ filename;
-
pattern:表示AWK在數據中查找的內容,就是匹配模式
-
action:在找到匹配內容時所執行的一系列命令
-
-F :參數,指定輸入文件折分隔符
-
-v :參數,賦值一個用戶定義變量
AWK的處理流程:首先拿出第一行,然後匹配第一個模板,如果匹配上,就執行action1,如果匹配不上,就什麼都不執行,然後匹配第二個模板,匹配上就執行action1,匹配不上就什麼也不執行。下面僅舉出一個例子,取出第三行的daemon字符串
[root@hadoop103 shell]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@hadoop103 shell]# awk -F : '/^daemon/{print $5}' /etc/passwd
daemon
$5表示取出的是第五列,$0表示取出整行。
我的公衆號:無聲回憶,瞭解一下,回覆1024,你會有一個驚喜 ^_^
[參考]:
[Shell之awk](https://coolshell.cn/articles/9070.html)