第二天 引用 命令執行順序 變量

目錄

引用

命令執行順序

變量

特殊變量


引用

爲防止shell解釋一些東西,所以就有了引用,四種符號  " ' ` \

雙引、單引和反引號

使用反斜線實現屏蔽,轉義。反斜線引用單個字符時,稱它爲轉義字符

雙引號除$ ` \ 三種符號外,引用所有內容,稱爲弱引用

[root@localhost script]# echo "$TERM pwd "
xterm pwd

[root@localhost script]# echo "`ls` pwd "
passwd
user pwd

[root@localhost script]# echo "\`ls\` pwd "
`ls` pwd

單引號引用所有內容,沒有字符擁有特殊含義,稱爲強引用

反引號

shell試圖替代單詞hello爲系統命令並執行它,因爲hello腳本或命令不存在,返回錯誤信息。

[root@localhost script]# echo `hello`
-bash: hello: command not found
[root@localhost script]# echo `date`
Mon Dec 30 18:08:21 CST 2013




如果使用引用得到的結果不理想,再試另一種,畢竟只有三種引用方式,可以充分嘗
試。


反斜線\

引用單個字符時,稱它爲轉義字符,

最強引用,可以轉義單引號

引用


單引號''
引用一串字符

強引用,單引號強,只有一個


引用


雙引號""

保留$ ` \ 三種符號的特殊含義

弱引用,雙引號

弱,有兩個

引用

當使用字符時,應總是使用雙引號,無論它是單個字符串或是多個單詞




反引號``
命令替換
命令替換



命令執行順序
&&,||,(),{} 四個符號的運用
shell腳本執行命令的時候,有時候會依賴於前一個命令是否執行成功。而&&和||就是用來判斷前一個命令執行效果的。

1  &&  與
  使用方法:命令1 &&  命令2
  這個方式簡單明瞭,命令1如果返回結果爲真(即執行返回爲0,成功執行)後,命令2才被執行
  換句話說,如果命令1執行成功&&那麼執行命令2
  這裏有個命令
  [ -f /home/dellogs.sh ] && echo "清除日至腳本存在"
  總之,&&符號代表如果第一個命令執行成功才執行第二個命令。
2  ||  或
  使用方法:命令1 || 命令2
  ||命令,如果命令1沒有執行成功則執行命令2
  如簡單例子
  cp wopper.txt oop.txt || echo "cp命令執行沒有成功"
  如果||左邊的命令沒有執行成功,則屏幕中除顯示“cp命令執行沒有成功”
  下面給出一個更爲實用的例子,
  awk ‘{print$1,$5}’ acc.qrt >qtr.tmp || echo "sorry the payroll(薪水) extraction(抽取) did'not work" | mail root
3 除了使用&&和||這兩方法外,還可以用(),{}這兩個符號把命令連接起來
 ()和{}存在的目的只是爲了,能一個shell或子shell中執行一組命令
  使用方法(命令1;命令2;命令3;...)和{命令1;命令2;命令3;...}
  這種情況比較少遇到,一般要和&&,||兩個命令一起使用。
  例如
  comet monthent || (echo “Hello,quess what! comet did not work”| mail root;exit)


變量

變量的賦值有五種:使用read命令,直接賦值,使用命令行參數,使用命令行的輸出結果,從文件讀取。
1 先說一下從read命令吧:(主要是在需要交互時使用)
Read命令是系統內置命令,語法格式爲:
read  變量1   變量2
當Shell腳本執行到read命令時,將暫停腳本的執行並等待鍵盤的輸入,當用戶輸入完畢並且敲下回車之後,將完成賦值操作,腳本繼續執行。
Read指令的規則:

多個數據或變量之間用空格隔開
若變量個數與數據個數相等時,對應取值
若變量個數大於數據個數時,沒有輸入數據的變量取空值
若變量個數小於數據個數時,將多餘的數據賦給最後一個變量(也就是把空格當成字符串處理)

例子:
#!/bin/bash
echo -n “ please enter your name”  //-n 表示用戶輸入和提示信息在同一行
read name
echo “your name is $name”
#!/bin/bash
echo “Please  enter  your  first name  and last name :”
read first last
echo “your first name is $first”
echo “your last name is $last”

2 第二種賦值方法就是直接給變量賦值(這種賦值方法主要是在不需要交互時,並且參數不需要修改時使用)
例如:name=xiaosu
     gender=man
3 第三種賦值方法是使用命令行參數賦值。(這種賦值方法是參數需要經常變化,並且不需要交互時使用)
這種賦值方法,也就是直接在命令後面跟參數,然後系統用$1來引用第一個參數。
4 第四種方法是利用命令的輸出結果賦值(這種賦值方法可以直接處理上個命令產生的數據)
在Shell程序中,可以將一個命令的輸出結果來當做變量,不過需要在賦值語句中使用反引號
例如currentdir=`pwd`
    echo $currentdir
5 最後一種賦值方法是從文件中讀入數據
這種方式就適合處理大批量的數據,直接把相應的數據寫入文件,然後運行腳本即可。
通常是通過while循環一行行讀入數據,即沒循環一次,就從文件中讀取一行數據,直到讀取到文件的結尾。
例如:
#!/bin/bash
ls *.sh >execfile
while read LINE
do
chmod a+x $LINE
done<execfile
這個腳本使用了while..do..done 結構,最後一行表示從文件execfile讀取數據。while read LINE表示 每次循環讀入一行數據並賦值給變量LINE。

6 變量的輸出
最簡單的方法就是使用echo
如果想輸出格式化的字符串,就需要使用printf,用法和C語言類似
printf 命令的格式說明符
\”    輸出雙引號
\\    輸出反斜槓
\a    響鈴
\n    換行
\r    回車


特殊變量
# vi variable
#!/bin/sh
echo "number:$#"
echo "scname:$0"

echo "first:$1"
echo "second:$2"
echo "argume:$@"
echo "show parm list:$*"
echo "show process id:$$"
echo "show precomm stat:$?"
# chmod +x variable
# ./variable aa bb
number:2
scname:./variable
first:aa
second:bb
argume:aa bb
show parm list:aa bb
show process id:24544
show precomm stat:0
通過顯示結果可以看到:
$# 是傳給腳本的參數個數
$0 是腳本本身的名字
$1 是傳遞給該shell腳本的第一個參數
$2 是傳遞給該shell腳本的第二個參數
$@ 是傳給腳本的所有參數的列表
$* 是以一個單字符串顯示所有向腳本傳遞的參數,與位置變量不同,參數可超過9個

該變量包含了所有輸入的命令行參數值。如果您運行showrpm openssh.rpm w3m.rpm webgrep.rpm
此時 $* 包含了 3 個字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.

$$ 是腳本運行的當前進程ID號
$? 是顯示最後命令的退出狀態,0表示沒有錯誤,其他表示有錯誤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章