1,獲取命令執行的結果,字符串拼接(腳本最常使用的功能)
法一:
cmd_result=$(date +%Y%b%d) //使用變量獲取命令執行的結果或者 cmd_result=`date +%Y%b%d` 反引號
mysqldump -uroot -pfeng --all jiale>/root/jiale$cmd_result.sql //執行字符串和變量拼接,也可以使用${cmd_result}
法二:
name="aaa"
one="hello,$name"
echo $one
從文件中獲取數據並拼接成字符串:
item=""
for num in $(cat health_item.txt);do item="$item,$num";done
echo $item
2.使用#來註釋,以及腳本執行的方法
腳本的開頭一般是
#!/bin/sh
因爲腳本前兩個字符一般是#!,系統會將這兩個字符之後的字符作爲執行腳本的命令解釋器的絕對路徑(也可以是其他腳本解釋器的路徑)
腳本執行的三個方法
(1)chmod u+x 腳本名 //給腳本執行權
./腳本名
(2)bash 腳本名 //直接使用shell啓動命令一般比上面的方法要慢一些
sh 腳本名
(3)使用bash內部命令source或“.”運行腳本
source 腳本名
. 腳本名 //“.”之後必須有一個空格
3,I/O重定向,管道(|)和後臺運行
cmd1 > file1 |
將命令1 的結果輸入到文件1中 |
cmd1 > >file1 |
將命令1 的結果追加到文件1中 |
cmd1 < file1 |
將文件1 的內容輸出作爲 命令 1執行 |
cmd1 << file1 |
將文件1 的內容追加到命令 1 |
cmd1 2> file1 |
錯誤輸出重定向,命令1執行的錯誤信息會輸入給文件1 |
cmd1 &> file1 |
標準輸出與錯誤輸出重定向,標準輸出和錯誤輸出一起輸入到文件1中,屏幕將無顯示 |
命令1 |命令2|命令1
將命令1的結果,輸出給命令2,作爲命令2的輸入,再將命令2的結果輸出給命令3,作爲命令3的輸入
命令1 |&命令2|命令1
將命令1的標準結果和標準錯誤信息,輸出給命令2,作爲命令2的輸入,再將命令2的結果輸出給命令3,作爲命令3的輸入
在命令後加入&,可以讓命令到後臺運行
COMMAND &
# gcc myproc.c&
4,命令執行順序
分號,多個命令用分號隔開,最後一個回車後,命令按順序執行
&& 連接連個命令,第一個命令執行成功後才能執行第二個命令
|| 連接連個命令,第一個命令執行失敗後才能執行第二個命令
5,shell通配符
? 表示任意單個字符
* 表示任意長度字符
[ ] 表示匹配[ ]給定字符集合的任意一個字符
{ } 表示將{ }中的字符串,以及前導和後繼字符作爲匹配條件
6,單引號,雙引號,反引號
單引號括起來的字符都會變成普通字符串
雙引號括起來的字符除 $ " ` \ 外都會變成普通字符串
反引號括起來的字符串會被作爲命令執行
7 declare [-afirx] 聲明變量類型
-a 定義爲數組
-f 定義爲函數
-i 定義爲整數
-r 定義爲只讀
-x 定義爲通過環境輸出比變量
declare -i plaus=1+2+4*4-5
echo plaus
8 test命令(如果不想使用tset可以使用“[ 表達式 ]”來代替,表達式前後有空格)
test -e file 測試文件是否存在,存在爲真
test -d file 測試文件是否存在且是目錄,是則爲真
test -x file 測試文件是否存在且可以執行,是則爲真
test -r file 測試文件是否存在且爲只讀,是則爲真
test -w file 測試文件是否存在且可寫入,是則爲真
test -b file 測試文件是否存在且爲塊設備,是則爲真
test -c file 測試文件是否存在且爲字符設備,是則爲真
test -s file 測試文件是否存在且長度大於0,是則爲真
test -f file 測試文件是否存在且是普通文件,是則爲真
9 數值比較測試
-eq 等於
-ne 不等於
-gt 大於
-lt 小於
-ge 大於等於
-le 小於等於
10 字符串比較測試
-z s1 如果字符串s1的長度是0,值爲真
-n s2 如果字符串s1的長度不爲0,值爲真
s1=s2 相等值爲真
s1!=s2 不相等值爲真
s1 如果字符串s1不是空串,值爲真
11 控制結構
11.1 if then else fi
echo "press y to continue"
read yn
if [ "$yn"="y" ] || [ "$yn"="Y"]; then echo "script is running"
else
echo "Stop"
fi
11.2 case ......esac
echo "press you select "
read number
case $number in //如果沒有read 交互式輸入,直接輸入使用$1 即(case $1 in )
one) echo "you choice is one"
;;
tw0) echo "you choice is two"
;;
*) echo "Usage {one|two}"
exit 1
esac
11.3 for (( 條件1;條件2;條件3))
for var in var1 var2 var3
while[ 條件1 ] && { || } [ 條件2 ] 當條件符合時就繼續
until [ 條件1 ] && { || } [ 條件2 ] 直到條件符合時才繼續
函數
函數名() {
}
For循環的寫法:
item=""
for num in $(cat health_item.txt);do item="$item,$num";done
echo $item
12 腳本調試
sh [-nvx] script.sh
-n 不執行腳本,查詢腳本內容語法,錯誤則列出 sh -n script.sh
-v 執行腳本之前先把腳本內容顯示在屏幕上
-x 將用到的腳本內容顯示在屏幕上
13 For循環詳解
在shell裏面,關於循環的語句很多,最簡單的一個
for .. in ..
do
...
done
這樣的結構就是一個簡單的循環,將列表中的每一個條目都循環一次。
瞭解編程的人都知道for和while循環的區別:
while,until的循環方式是必須要“符合某個條件”的狀態,再循環
for這種語法則是“已經知道將要進行幾次循環”的狀態。
所以for循環的語法結構如下:
for var in con1 con2 con3...
do
程序段
done
就上面的語法結構來說,這個var的變數內容在循環工作的時候:
1 第一次循環時,var的內容是con1;
2 第二次循環時,var的內容是con2;
3 第三次循環時,var的內容是con3;
......
例子:
for f in test*; do mv $f $f.log;done
將文件夾中test開頭的文件重命名爲testXXX.log
關於for比較全的用法
1、
for((i=1;i<=10;i++));do echo $(expr $i \* 4);done
2、在shell中常用的是 for i in $(seq 10)
3、for i in `ls`
4、for i in ${arr[@]}
5、for i in $* ; do
6、for File in /proc/sys/net/ipv4/conf/*/accept_redirects; do
7、for i in f1 f2 f3 ;do
8、for i in *.txt
9、for i in $(ls *.txt)
for in語句與` `和$( )合用,利用` `或$(
)的將多行合爲一行的缺陷,實際是合爲一個字符串數組
##for num in $(seq 1 100)
10、LIST="rootfs usr data data2"
for d in $LIST; do
用for in語句自動對字符串按空格遍歷的特性,對多個目錄遍歷
11、for i in {1..10}
12、for i in stringchar {1..10}
13、awk 'BEGIN{for(i=1; i<=10; i++) print i}'
注意:AWK中的for循環寫法和C語言一樣的