Shell学习笔记
Shell脚本的优点主要体现在:
- 可以无缝的执行命令
- grep,awk,sed在字符串处理上编码量非常少
- 管道+shell控制流+shell变量,让文件操作编码量非常少
grep,sed,awk的差别和联系
- grep:抽取出满足某些正则表达式的行
例如:grep ^[0-9] $x
#找到以数字开头的行
- sed:对满足某些正则表达式的行进行置换,添加
例如:sed s/,/' '/ > ${x/Pos_/PosLine_}
#把','替换为' '。输出重定向到文件名为$x变量中替换‘Pos_’为‘PosLine_’
- awk:列处理,对统一格式的行有奇效,已经发展成自身一套语言
例如:awk -F[adc] '{print $2}'
#打印以'a','d','c'为分割,的第二列
码量是不是很少?
最终用于我的实验的脚本(递归遍历文件,对相应文件执行操作):
#!/bin/bash
myfunc()
{
for x in $(ls)
do
if [ -f "$x" ];then
if [[ $x == faultPos_*.txt ]];then
echo "$x";
grep ^[0-9] $x | awk -F[adc] '{print $2}' | sed s/,/' '/ > PosLine
fi
elif [ -L "$x" ];then
echo "this is a link";
else
cd "$x";
myfunc;
cd ..
fi
done
}
myfunc
==========以下是叨叨念===========
学习资料
- 《shell十三问》
- manual
- 找实例源代码查看(我看的是TC的一个运营脚本库)
- awk与sed的区别?
- 我觉着,如果是按行操作,就统统都用 sed
- 如果是不仅按行,还要按列操作,就统统都用 awk
- 还是学习sed
- QUOTE: 若從技術細節來看,
- shell 會依據 IFS(Internal Field Seperator) 將 command line 所輸入的文字給拆解為"字段"(word)。
- 然後再針對特殊字符(meta)先作處理,(例如变量替换)
- 最後再重組整行 command line 。
- 花括号的作用
- 此外,我們也可利用命令行的變量替換能力來"擴充"(append)變量值:
- A=BCD
- A=$AE
- 因為第二次是將 A 的值繼承 $AE 的提換結果,而非 $A 再加 E ﹗
- A=BCD
- A=${A}E
- 我們使用 {} 將變量名稱的範圍給明確定義出來,
- 此外,我們也可利用命令行的變量替換能力來"擴充"(append)變量值:
- 当一个subprocess执行shell命令的时候,什么东西被继承呢?
- 所有
- 每一条shell脚本语句都会产生一个subprocess么?还是整个shell脚本产生一个subprocess?
- source和sh有什么不同呢?
- * 所謂 source 就是讓 script 在當前 shell 內執行、而不是產生一個 sub-shell 來執行。
- * 所謂 source 就是讓 script 在當前 shell 內執行、而不是產生一個 sub-shell 來執行。
- exec和sh有什么不同呢?
- exec是用程序替换掉当前的shell,相当于原来的shell完全kill了
- ()与{}有什么区别?
- ( ) 將 command group 置於 sub-shell 去執行,也稱 nested sub-shell。
- 注意()中的内容肯定会被执行
- { } 則是在同一個 shell 內完成,也稱為 non-named command group。
- ( ) 將 command group 置於 sub-shell 去執行,也稱 nested sub-shell。
- shell中的function是什么?与其他语言的function有什么区别?
- 所謂的 function ,就是用一個名字去命名一個 command group ,然後再調用這個名字去執行 command group
- 与传统的function的区别是,仅仅是用 command group 去替换函数名
- 所謂的 function ,就是用一個名字去命名一個 command group ,然後再調用這個名字去執行 command group
- shell脚本的参数传递:
- script_name parameter1 parameter2 parameter3 ...
- 那么shell函数的参数传递是怎样的呢?positional parameter
- 舉例而言:
- 假設 my.sh 裡有一個 fucntion 叫 my_fun ,
- 若在 script 中跑 my_fun fp1 fp2 fp3 ,
- 那麼,function 內的 $0 仍然是 my.sh ,而 $1 則是 fp1 而非 p1 了...
- 注意$10只是$1+‘0’
- 想用第十个参数:
- 方法一是使用我們上一章介紹的 ${ } ,也就是用 ${10} 即可。
- 方法二,就是 shift 了。shift 掉多少個參數,才可用 $1 取得 ${10} 呢
- shift 9
- 想用第十个参数:
- 怎样知道参数个数呢?
- $#
- $@ 與 $*
- command line 上跑 my.sh p1 "p2 p3" p4 的話
- "$@" 則可得到 "p1" "p2 p3" "p4" 這三個不同的詞段(word)﹔
- "$*" 則可得到 "p1 p2 p3 p4" 這一整串單一的詞段。
- "$@" 則可得到 "p1" "p2 p3" "p4" 這三個不同的詞段(word)﹔
- command line 上跑 my.sh p1 "p2 p3" p4 的話
- $(( )) 與 $( ) 還有${ } 有什么区别?
- $()是用来做什么的?
- $( ) 與 ` ` (反引號) 都是用來做命令替換用(command substitution)的
- shell的数组
- A=(a b c def)
- echo ${A[@]} 或 ${A[*]};全部数组
- echo ${A[0]} ; 第0个元素
- A=(a b c def)
- $(( )) 的用处是什么?
- 用来做正数运算的
- + - * / :分別為 "加、減、乘、除"。
- % :餘數運算
- & | ^ !:分別為 "AND、OR、XOR、NOT" 運算。
- 注意在 $(( )) 中的變量名稱,可於其前面加 $ 符號來替換,也可以不用,如:
$(( $a + $b * $c)) 也可得到 19 的結果
- 用来做正数运算的
- 有没有函数的返回值呢?
- * 若在 script 裡,用 exit RV 來指定其值,若沒指定,在結束時以最後一道命令之 RV 為值。
- * 若在 function 裡,則用 return RV 來代替 exit RV 即可
- $?是什么?
- $?是最近的一个返回值
- 举个例子:
$ touch my.file
$ ls my.file
$ echo $? # first echo
0
$ ls no.file
ls: no.file: No such file or directory
$ echo $? # second echo
1
$ echo $? # third echo
0
- test命令是用来什么的?
- 有一個命令卻是"專門"用來測試某一條件而送出 return value 以供 true 或 false 的判斷,
它就是 test 命令了﹗ - test有两种格式
- test expressiong
- [ expression ] (注意[ ] 之間的空白鍵)
- bash 的 test 目前支援的測試對像只有三種:
* string:字串,也就是純文字。
* integer:整數( 0 或正整數,不含負數或小數點)。
* file:文件。
- 有一個命令卻是"專門"用來測試某一條件而送出 return value 以供 true 或 false 的判斷,
- test具体使用的例子?
- 以 A=123 這個變量為例:
* [ "$A" = 123 ]:是字串的測試,以測試 $A 是否為 1、2、3 這三個連續的"文字"。
* [ "$A" -eq 123 ]:是整數的測試,以測試 $A 是否等於"一百二十三"。
* [ -e "$A" ]:是關於文件的測試,以測試 123 這份"文件"是否存在。
- 以 A=123 這個變量為例:
- 多重复合测试
- * expression1 -a expression2 :當兩個 exrepssion 都為 true ,才送出 0 ,否則送出非 0 。
* expression1 -o expression2 :只需其中一個 exrepssion 為 true ,就送出 0 ,只有兩者都為 false 才送出非 0 。 - 举例:[ -d "$file" -a -x "$file" ]
表示當 $file 是一個目錄、且同時具有 x 權限時,test 才會為 true 。
- * expression1 -a expression2 :當兩個 exrepssion 都為 true ,才送出 0 ,否則送出非 0 。
- 逻辑组合command line
- && 與 || 都是用來"組建"多個 command line 用的:
- * command1 && command2 :其意思是 command2 只有在 RV 為 0 (true) 的條件下執行。
- * command1 || command2 :其意思是 command2 只有在 RV 為非 0 (false) 的條件下執行。
- 举例
-
$ A=123
$ [ -n "$A" ] && echo "yes! it's ture."
yes! it's ture.
$ unset A
$ [ -n "$A" ] && echo "yes! it's ture."
$ [ -n "$A" ] || echo "no, it's NOT ture."
no, it's NOT ture.
-
- && 與 || 都是用來"組建"多個 command line 用的:
浙公网安备 33010602011771号