1、 shell 編程跳轉目錄使用 cd 時無效
例如 : 腳本 cd.sh
#!/bin/sh
cd /etc
解決辦法和出錯原因
這是因為你的腳本是由shell終端fork產生的子shell執行的,所以腳本執行完畢子shell也結束,因而返回父shell也就是當前的終端
可使用
# source cd.sh 或者
# . . /cd.sh 注意這里的格式為 #點/空格/點/cd.sh
也就是說我們所建立的 。sh 程序本身是Linux shell 創建的一個子進程。在使用cd 跳轉時,實際是已經執行了跳轉指令了,但在
這個 .sh 腳本結束的時候,父進程 終端shell 就拿到了主動權,它又將目錄轉回為原來的目錄,執行下面的腳本,有助于你理解這個問題
#! /bin/sh
cd /etc
mypath='pwd'
echo "$mypath"
執行后,會打印信息可以幫你理解上面的問題。
2、 C 和 shell 混合編程
#i nclude<stdlib.h>
main()
{
system(“ls -al /etc/passwd /etc/shadow”);
}
執行結果:
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
-r--------- 1 root root 572k
3、shell 變量
詳細出處參考: http://www.itwis.com/html/os/linux/20100202/7373.html
http://56214415.blog.51cto.com/745987/375832
linux中shell變量$#,$@,$0,$1,$2的含義解釋:
變量說明:
$$
Shell本身的PID(ProcessID)
$!
Shell最后運行的后臺Process的PID
$?
最后運行的命令的結束代碼(返回值)
$-
使用Set命令設定的Flag一覽
$*
所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。
$@
所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。
$#
添加到Shell的參數個數
$0
Shell本身的文件名
$1~$n
添加到Shell的各參數值。$1是第1參數、$2是第2參數…。
我們先寫一個簡單的腳本,執行以后再解釋各個變量的意義
# touch variable
# vi variable
腳本內容如下:
#!/bin/sh
echo "number:$#"
echo "scname:$0"
echo "first :$1"
echo "second:$2"
echo "argume:$@"
保存退出
賦予腳本執行權限
# chmod +x variable
執行腳本
# ./variable aa bb
number:2
scname:./variable
first: aa
second:bb
argume:aa bb
通過顯示結果可以看到:
$# 是傳給腳本的參數個數
$0 是腳本本身的名字
$1是傳遞給該shell腳本的第一個參數
$2是傳遞給該shell腳本的第二個參數
$@ 是傳給腳本的所有參數的列表
關于$@和$*是否作用相同的問題,我測試了下,應該是相同的
3、shell 函數內部變量 及 函數$1 $2 $*的使用
#!/bin/sh
TEST_ONE=first
TEST_TWO=second
test()
{
echo "$1"
echo "$2"
}
test $TEST_ONE $TEST_TWO
執行結果為
first
second
也就是說 在shell 函數后面跟的變量會依次被指定為$1 和 $2 后面如果還有變量就會依次$*
下面我們來看一個更復雜的例子,結合這個例子,我們來講述Shell Script的語法。
2 #wehavelessthan3arguments. Print thehelptext:
3 if [$#-lt3]; then
4 cat<<HELP
5 ren --renamesanumberof files usingsedregularexpressions
6
7 USAGE: ren 'regexp''replacement' files

8 EXAMPLE: rename all*.HTM files in*.html:
9 ren 'HTM$''html'*.HTM
10
11 HELP
12 exit 0
13 fi
14 OLD="$1"
15 NEW="$2"
16 #The shift command removesoneargumentfromthelistof
17 # command linearguments.
18 shift
19 shift
20 #$*containsnowallthe files :
21 for filein$*; do
22 if [-f"$file"]; then
23 newfile=` echo "$file"|sed"s/${OLD}/${NEW}/g"`
24 if [-f"$newfile"]; then
25 echo "ERROR:$newfileexistsalready"
26 else
27 echo "renaming$fileto$newfile

28 mv"$file""$newfile"
29 fi
30 fi
31 done
我們從頭來看,前面兩行上一個例子中已經解釋過了,從第三行開始,有新的內容。if語句和其他編程語言相似,都是流程控制語句。它的語法是:
if …; then
…
elif …; then
…
else
…
fi
與其他語言不同,Shell Script中if語句的條件部分要以分號來分隔。第三行中的[]表示條件測試,常用的條件測試有下面幾種:
[ -f "$file" ] 判斷$file是否是一個文件
[ $a -lt 3 ] 判斷$a的值是否小于3,同樣-gt和-le分別表示大于或小于等于
[ -x "$file" ] 判斷$file是否存在且有可執行權限,同樣-r測試文件可讀性
[ -n "$a" ] 判斷變量$a是否有值,測試空串用-z
[ "$a" = "$b" ] 判斷$a和$b的取值是否相等
[ cond1 -a cond2 ] 判斷cond1和cond2是否同時成立,-o表示cond1和cond2有一成立
要注意條件測試部分中的空格。在方括號的兩側都有空格,在-f、-lt、=等符號兩側同樣也有空格。如果沒有這些空格,Shell解釋腳本的時候就會出錯。
$#表示包括$0在內的命令行參數的個數。在Shell中,腳本名稱本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整個參數列表,不包括$0,也就是說不包括文件名的參數列表。
現在我們明白第三行的含義是如果腳本文件的參數少于三個,則執行if和fi語句之間 的內容。然后,從第四行到第十一行之間的內容在Shell Script編程中被稱為Here文檔,Here文檔用于將多行文本傳遞給某一命令。Here文檔的格式是以<<開始,后跟一個字符串,在 Here文檔結束的時候,這個字符串同樣也要出現,表示文檔結束。在本例中,Here文檔被輸出給cat命令,也即將文檔內容打印在屏幕上,起到顯示幫助 信息的作用。
第十二行的exit是Linux的命令,表示退出當前進程。在Shell腳本中可以使用所有的Linux命令,利用上面的cat和exit,從一方面來說,熟練使用Linux命令也可以大大減少Shell腳本的長度。
十四、十五兩句是賦值語句,分別將第一和第二參數賦值給變量OLD和NEW。緊接下來的兩句是注釋,注釋下面的兩條shift的作用是將參數列表中的第一個和第二個參數刪除,后面的參數依次變為新的第一和第二參數,注意參數列表原本也不包括$0。
然后,自二十一行到三十一行是一個循環語句。Shell Script中的循環有下面幾種格式:
while [ cond1 ] && { || } [ cond2 ] …; do
…
done
for var in …; do
…
done
for (( cond1; cond2; cond3 )) do
…
done
until [ cond1 ] && { || } [ cond2 ] …; do
…
done
在上面這些循環中,也可以使用類似C語言中的break和continue語句中斷 當前的循環操作。第二十一行的循環是將參數列表中的參數一個一個地放入變量file中。然后進入循環,判斷file是否為一個文件,如果是文件的話,則用 sed命令搜索和生成新的文件名。sed基本上可以看成一個查找替換程序,從標準輸入,例如管道讀入文本,并將結果輸出到標準輸出,sed使用正則表達式 進行搜索。在第二十三行中,backtick(`)的作用是取出兩個backtick之間的命令輸出結果,在這里,也就是將結果取出賦給變量 newfile。此后,判斷newfile是否已經存在,否則就把file改成newfile。這樣我們就明白這個腳本的作用了,Shell Script編寫的其他腳本與此相似,只不過是語法和用法稍有不同而已。
通過這個例子我們明白了Shell Script的編寫規則,但還有幾件事情需要講述一下。
第一個,除了if語句之外,Shell Script中也有類似C語言中多分支結構的case語句,它的語法是:
case var in
pattern 1 )
… ;;
pattern 2 )
… ;;
*)
… ;;
esac
我們再就下面一個例子,看看case語句的用法。
while getopts vc: OPTION
do
case $OPTION in
c) COPIES=$OPTARG
ehco "$COPIES";;
v) echo "suyang";;
\?) exit 1;;
esac
done
上面的getopts類似于C語言提供的函數getopts,在Shell Script中,getopts經常和while語句聯合起來使用。getopts的語法如下:
getopts option_string variable
option_string中包含一串單字符選項,若getopts在命令行參數中 發現了連字符,那么它會將連字符之后的字符與option_string進行比較,若匹配成功,則把變量variable的值設為該選項,若無匹配,則把 變量的值設為?。有時候,選項還會帶一個值,例如-c5等,這時要在option_string中該選項字母后面加上一個冒號,getopts發現冒號 后,會讀取該值,然后將該值放入特殊變量OPTARG中。這個命令比較復雜,如有需要,讀者可以詳細參閱Shell編寫的相關資料。
上面這個循環的作用就是依次取出腳本名稱后面的選項,進行處理,如果輸入了非法選項,則進入"?指定的部分,退出腳本程序。
第二個,Bash提供了一種用于交互式應用的擴展select,用戶可以從一組不同的值中進行選擇。其語法如下:
select var in …; do
break;
done
例如,下面這段程序的輸出是:
#!/bin/bash
echo "Your choice?"
select var in "a" "b" "c"; do
break
done
echo $var
----------------------------
Your choice?
1) a
2) b
3) c
第三,Shell Script中也可以使用自定義的函數,其語法形式如下:
functionname()
{
…
}
例如我們可以把上面第二個例子中第四到第十二行放入一個名為help函數體內,以后每次調用的時候直接寫help即可。函數中處理函數調用參數的方法是,直接用上面講過的$1、$2來分別表示第一、第二個參數,用$*表示參數列表。
第四,我們也可以在Shell下調試Shell Script腳本,當然最簡單的方法就是用echo輸出查看變量取值了。Bash也提供了真正的調試方法,就是執行腳本的時候用-x參數。
sh ?x filename.sh
這會執行腳本并顯示腳本中所有變量的取值,也可以使用參數-n,它并不執行腳本,只是返回所有的語法錯誤。
5、shell 讀一個文件 將每一行轉換成為變量
sys_info=$(cat /usr/local/sysconfig.txt)
var=`echo $sys_info | awk -F ', ' '{print $0} ' | sed "s/,/ /g "`
ip=$(echo $var | awk '{print $1}')
netmask=$(echo $var | awk '{print $2}')
gateway=$(echo $var | awk '{print $3}')
db_ip=$(echo $var | awk '{print $4}')
record_ip=$(echo $var | awk '{print $5}')
或者使用
IP=$(sed -n '1p' /opt/config)
echo "$IP"
DIR=$(sed -n '2p' /opt/config)
echo "$UPDATEDIR"
FILE=$(sed -n '3p' /opt/config)
echo "$FILE"
6、shell 檢測終端輸入 將輸入內容轉化成為變量
while read var1 var2 var3; do
echo var1=${var1} var2=${var2}
done
7、找到動態 驅動設備節點
找到動態 驅動設備節點
awk "\$2==\"PWM\" {print \$1}" /proc/devices
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
