Shell 學習筆記2

第四章

特殊位置參數變量

$0 # 路徑
$n # 1~9不用說了,0表示腳本的文件名,大於9,帶大括號
$# # 參數的總個數
$* # 不加引號和$@相同,加雙引號視爲單個字符串,至關於「$1 $2 $3」
$@ # 不加引號和$*相同,加雙引號有區別,視爲不一樣的獨立字符串,至關於"$1" "$2" "$3" "..."

$n

# \ ${1..15} > n.sh # 四個
echo \${1..15} >n.sh # 利用大括號輸出15個位置參數並定向到文件 n.sh 裏。
echo ${10} # 正確
echo $10   # 不正確

只須要關注特殊變量($1)的內容。
clipboard.pnglinux

獲取腳本的名稱及路徑

# 寫好vi n.sh
sh /server/scripts/n.sh # 輸出 /server/scripts/n.sh

# dirname 及 basename
dirname /server/scripts/n.sh # /server/scripts
basename /server/scripts/n.sh # n.sh

# $0
dirname $0 # 輸出結果見上面
basename $0

rpcbind 系統腳本
clipboard.pngshell

經過 $# 獲取腳本傳參的個數

[ $# -ne 2 ] && {
  echo "muse two args" 輸入除了兩個數字或連續字符串,才輸出結果。三個以上能不,也不能。
  exit 1
}
echo wyc   # 輸入兩個數字或連續字符串,才能輸出結果。
##########
if [ $# -ne 2 ]
  then
    echo "USAGE:/bin/sh $0 arg1 arg2"  # 輸入除了兩個數字或連續字符串,輸出結果是USAGE:/bin/sh b.sh arg1 arg2。
    exit 1
fi
echo $1 $2 # 輸入兩個數字或連續字符串,才能輸出結果;

$* $@學習

set -- "I am" man woman.

for i in $@;do echo $i;done  # for i | in "$@"; | do | echo $i; | done |
for i;do echo $i;done

shift
echo $# # 2
echo $1 # man
echo $2 # woman

linux下set和eval的使用小案例解答

本博文主要是講解學生提出的以下一行命令腳本定義的真正內涵:
runlevel=$(set -- $(runlevel); eval "echo \$$#" ) 
如下是老男孩培訓14期VIP羣內的對話解答記錄,內容已作過濾,有的網友之前反映過,說老男孩發的記錄時間對不上,其實老男孩只是以對話問答的形式讓你們掌握技術而已,內容是加工過的屬正常,不要大驚小怪,給你們看的必定是最容易理解的對話過程,也儘可能保持了原來的對話。
解答對話:
北京-劉同窗(123437415) 2013/4/10 23:01:07
求問一些服務的啓動腳本runlevel=$(set -- $(runlevel); eval "echo \$$#" ) 這個runlevel是怎麼把這個運行級別的取到的
 
北京老男孩老師(49000448) 10:57:44
你敲一下runlevel看看。
 
北京-劉同窗(123437415) 10:59:39
[root@G307 ~]# runlevel
N 3
 
北京老男孩老師(49000448) 11:00:31
後面的3就是運行級別

北京-劉同窗(123437415) 11:00:39
啊,明白了,他是 $#=2 而後 $2=3是這樣吧
老男孩老師點評:對。

北京-陶同窗<DD@sina.com> 11:05:19
$# 獲取當前shell命令行中參數的總個數
$n 獲取當前執行的shell腳本的第n個參數值,n=1,...9,當n爲0時表示腳本的文件名,若是n大於9,用大括號括起來${10}
老男孩老師點評:這個同窗說的是命令行腳本傳參的內容,也適合本文。

北京-李燦(123458724) 11:08:22
eval對echo \$$#的雙重掃描
假如要的參數不是最後一個 那麼這個總數 就不許確了是吧
老男孩老師點評:對的。取最後一個才能這麼用。

北京老男孩老師(49000448) 11:09:19
set 和eval的用法比較特殊,後期課程慢慢的給你們滲透,如今是學習的剛剛開始啊。
先給你們一個例子:
[root@oldboy ~]# set -- "I am" handsome oldboy. #==>傳入三個參數
[root@oldboy ~]#
[root@oldboy ~]# echo $#    #==>如今有三個參數
3
[root@oldboy ~]# for i in $*;do echo $i;done #==>循環打印這些參數,用$*,無引號
I
am
handsome
oldboy.
[root@oldboy ~]# for i in $@;do echo $i;done #==>在沒有雙引號的狀況下,這裏的結果$*和$@是同樣的
I
am
handsome
oldboy.
 
北京老男孩老師(49000448) 11:10:22
上面是我們老男孩培訓後期課程教案裏的一個例子
 
北京老男孩老師(49000448) 11:12:59
[root@oldboy ~]# set -- $(runlevel)
[root@oldboy ~]# echo $#
2
[root@oldboy ~]# echo $(set $(runlevel); eval "echo $2" )
3
劉同窗同窗你理解這個吧。這個會了,那個就差很少了
 
北京-劉同窗(123437415) 11:13:45
恩,懂了
 
北京老男孩老師(49000448) 11:13:55
set能夠像命令行同樣設置傳參,這個用法很少見!
瞭解就得,工做幾乎不須要必須用它
 
北京-劉同窗(123437415) 11:14:20
恩,好的
 
北京老男孩老師(49000448) 11:15:42
既然你懂了,我就在多說下,哈哈!
runlevel=$(set -- $(runlevel); eval "echo \$$#" )
1)這裏的$#就是參數個數爲2,即runlevel的結果, 因此\$$#就是$2,即runlevel結果的第二列3
[root@G307 ~]# runlevel
N 3
2)eval就是把echo的字符串,當作命令解析!解答了這麼多 其實知識含量已經很是多了。
能夠寫一篇博文了。
 
北京-李燦(123458724) 11:16:52
echo $ #輸出括號內的值
(set $(runlevel); #將runlevel參數值,傳入shell,N 3
 eval "echo $2" ) #eval二次掃描,首先掃描到echo輸出$2,第二次解析$2的值爲等級3
這樣子嗎?
 
北京老男孩老師(49000448) 11:17:15
GOOD,贊啊!李同窗強悍啊,加油,將來是塊學習linux的材料,嘿嘿!
 
北京老男孩老師(49000448)  11:33:43
提醒下啊,問完問題 還有點事要作啊
這是老師給老男孩培訓的全體同窗們解答問題的惟一默認條件。。
總結好,發到我們羣共享裏或者傳到SVN共享裏。
再強調下啊:同窗們和老男孩老師學習,最應該學習的就是這樣的學習方法和學習習慣,而不單單是技術本文,同窗們切記。此次我也會發博文總結本次的對話,算是給大家作個榜樣吧,下次就是大家了。
相關文章
相關標籤/搜索