欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

shell 編程 /****** 不定期更新 **************

系統 1809 0

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 后面如果還有變量就會依次$*



4、shell 一些基礎編程 例如 判斷數字變量的大小,自定義函數的使用 此知識點來源于網絡

下面我們來看一個更復雜的例子,結合這個例子,我們來講述Shell Script的語法。

1 #!/bin/bash
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





shell 編程 /****** 不定期更新 **************/


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩视频在线一区二区 | 国产精品一区二区免费 | 欧美一级大片免费观看 | 色综合天天综合高清网国产 | 97av视频在线播放 | 色五月丁香五月综合五月 | 色99视频 | 色五五月五月开 | 午夜精品在线观看 | 亚洲精品无码国产爽快A片百度 | 婷婷欧美| 色婷婷综合久久久中文字幕 | 激情婷婷成人亚洲综合 | 色福利网 | 欧美日韩国产一区二区三区 | 亚洲热综合 | 欧美在线黄 | 看真人视频a级毛片 | 婷婷香蕉| 91精品综合久久久久久五月天 | 大香一本蕉伊线亚洲网 | 午夜剧院官方 | 久久亚洲精品中文字幕二区 | 久久国产成人 | 国产一级在线观看视频 | 欧美一区二 | 精品久久久久久久久久久久久久 | 亚洲成人在线免费视频 | 久久久99精品免费观看 | 成人精品视频一区二区三区尤物 | 中国大陆高清aⅴ毛片 | 日本高清在线精品一区二区三区 | 亚洲国产日韩在线一区 | 无遮挡羞羞视频 | 日日噜噜夜夜狠狠视频buoke | 国产精品国产三级国产播12软件 | 欧美 日产 国产精品 | 九九九久久久久久久爱 | 亚洲一级毛片 | 国产精品黄视频 | 全日本爽视频在线 |