set問題詢問 - Linux
![Christine avatar](/img/girl1.jpg)
By Christine
at 2017-09-09T22:02
at 2017-09-09T22:02
Table of Contents
※ 引述《Tverous (Orah~)》之銘言:
: 各位前輩打擾了
: 想在這請教兩個問題
: 第一個是有關set的用法
: 不太懂的是關於set --
你下面的 script 寫法很 fuzzy,單純討論 set -- 用途就好
: 查詢之後似乎是說:
: set -- tells set to stop accepting flags and to stop outputting all the
: variables when not passed any argument
: 單純set -- 是的確不會print all variables
: 但當有參數時,例如: set -- `ls`
: 似乎還是會指定argument給positional parameter
: 所以來問一下關於set --的正確用法
: 以及確認自己有沒有弄錯的地方
#1
test.sh 檔案:
#!/bin/bash
echo $1 $2 $3
執行 test.sh aaa bbb ccc 會出現 aaa bbb ccc
#2
程式碼改成:
#!/bin/bash
set --
echo $1 $2 $3
那執行 test.sh aaa bbb ccc 之後不會輸出東西,因為都吃掉了
也就是等於沒有傳入參數/引數
#3
改成:
#!/bin/bash
set -- hello world peter
echo $1 $2 $3
那執行 test.sh 後面不管管啥參數都固定顯示 hello world peter
所以你用 test.sh xx zz aa 都還是看到 hello world peter
#4
改成
#!/bin/bash
set -- `ls`
echo $1 $2 $3
那先假設 ls 執行時候若當時候工作目錄有 123.txt 與 456.txt 檔案,那執行
test.sh 後面不管傳啥參數都固定顯示 123.txt 456.txt
因為 set 那行會先等於執行 set -- 123.txt 456.txt
其實這邊都看懂後面就簡單了
: 另外一個問題是以下的shell script中:
: #!/bin/sh
: # killbyname.sh: Kills a process by name -- but only a single instance
: #
: set -- `ps -u $LOGNAME | grep “ $1$”` # $1 here is different from
: if [ $# -eq 4 ] ; then
: kill -KILL $1 # the one here
: else
: echo “Either process $1 not running or more than one instance running”
: fi
: 把它命名為killbyname.sh
: 並如下執行:
: $ sh
: $ sh
: $ killbyname.sh sh
sh 跑兩個,若 ps -u 找出來結果有包含就會有兩行,程式碼用 $# 判斷引數/參數
數量只能夠有 4 個,實際上確有 8 個,所以這環境下執行會出現一個 Either 那錯誤
: 為什麼會說$1會是sh的PID,且在調用set之後script argument不再可見?
[root@localhost ~]# ps -u root | grep vim
24804 pts/0 00:00:00 vim
24927 pts/2 00:00:00 vim
這個來說... 你程式碼執行其被 set -- `ps .... | grep ...` 之後,那...
$1 就是 24804, $2 就是 pts/0, $3 就是 00:00:00, $4 就是 vim
$5 就是 24927, $6 就是 pts/2, $7 就是 00:00:00, $8 就是 vim
然後 $# 會是 8
塑易 $1 就是 vim 本身的 pid 數值 24804
或者是更進一步來說實際就是等於執行了:
set -- 24804 pts/0 00:00:00 vim 24927 pts/2 00:00:00 vim
所以 script 內使用 $1 就是 24804,不是原本那個執行 script 傳入的 sh 這個參數
: 照理來說不是一樣找到帶sh的行 並重新用set指定給positional parameter
: 然後成功kill掉sh嗎?
: 希望能提供詳細的解釋
: 在這請教前輩們以上問題 再拜託了 非常感謝
: 以下是原文圖片:
: http://imgur.com/a/aj5XH
: http://imgur.com/a/Jc6Ux
: http://imgur.com/a/FkBPr
最後實務上很少會用 set -- 這類語法,很特殊情況才會用到。
--
如果真的愛一個作業系統 怎能不害怕不再能使用它 而我們必須接受現實
於是長大了 寂寞就是沒有了機會再用它 比沒有電腦還要寂寞
而那些點亮我們生命的作業系統 就彷彿電影中發生在暹邏的愛情故事
即使短暫使用也會刻骨銘心
--
: 各位前輩打擾了
: 想在這請教兩個問題
: 第一個是有關set的用法
: 不太懂的是關於set --
你下面的 script 寫法很 fuzzy,單純討論 set -- 用途就好
: 查詢之後似乎是說:
: set -- tells set to stop accepting flags and to stop outputting all the
: variables when not passed any argument
: 單純set -- 是的確不會print all variables
: 但當有參數時,例如: set -- `ls`
: 似乎還是會指定argument給positional parameter
: 所以來問一下關於set --的正確用法
: 以及確認自己有沒有弄錯的地方
#1
test.sh 檔案:
#!/bin/bash
echo $1 $2 $3
執行 test.sh aaa bbb ccc 會出現 aaa bbb ccc
#2
程式碼改成:
#!/bin/bash
set --
echo $1 $2 $3
那執行 test.sh aaa bbb ccc 之後不會輸出東西,因為都吃掉了
也就是等於沒有傳入參數/引數
#3
改成:
#!/bin/bash
set -- hello world peter
echo $1 $2 $3
那執行 test.sh 後面不管管啥參數都固定顯示 hello world peter
所以你用 test.sh xx zz aa 都還是看到 hello world peter
#4
改成
#!/bin/bash
set -- `ls`
echo $1 $2 $3
那先假設 ls 執行時候若當時候工作目錄有 123.txt 與 456.txt 檔案,那執行
test.sh 後面不管傳啥參數都固定顯示 123.txt 456.txt
因為 set 那行會先等於執行 set -- 123.txt 456.txt
其實這邊都看懂後面就簡單了
: 另外一個問題是以下的shell script中:
: #!/bin/sh
: # killbyname.sh: Kills a process by name -- but only a single instance
: #
: set -- `ps -u $LOGNAME | grep “ $1$”` # $1 here is different from
: if [ $# -eq 4 ] ; then
: kill -KILL $1 # the one here
: else
: echo “Either process $1 not running or more than one instance running”
: fi
: 把它命名為killbyname.sh
: 並如下執行:
: $ sh
: $ sh
: $ killbyname.sh sh
sh 跑兩個,若 ps -u 找出來結果有包含就會有兩行,程式碼用 $# 判斷引數/參數
數量只能夠有 4 個,實際上確有 8 個,所以這環境下執行會出現一個 Either 那錯誤
: 為什麼會說$1會是sh的PID,且在調用set之後script argument不再可見?
[root@localhost ~]# ps -u root | grep vim
24804 pts/0 00:00:00 vim
24927 pts/2 00:00:00 vim
這個來說... 你程式碼執行其被 set -- `ps .... | grep ...` 之後,那...
$1 就是 24804, $2 就是 pts/0, $3 就是 00:00:00, $4 就是 vim
$5 就是 24927, $6 就是 pts/2, $7 就是 00:00:00, $8 就是 vim
然後 $# 會是 8
塑易 $1 就是 vim 本身的 pid 數值 24804
或者是更進一步來說實際就是等於執行了:
set -- 24804 pts/0 00:00:00 vim 24927 pts/2 00:00:00 vim
所以 script 內使用 $1 就是 24804,不是原本那個執行 script 傳入的 sh 這個參數
: 照理來說不是一樣找到帶sh的行 並重新用set指定給positional parameter
: 然後成功kill掉sh嗎?
: 希望能提供詳細的解釋
: 在這請教前輩們以上問題 再拜託了 非常感謝
: 以下是原文圖片:
: http://imgur.com/a/aj5XH
: http://imgur.com/a/Jc6Ux
: http://imgur.com/a/FkBPr
最後實務上很少會用 set -- 這類語法,很特殊情況才會用到。
--
如果真的愛一個作業系統 怎能不害怕不再能使用它 而我們必須接受現實
於是長大了 寂寞就是沒有了機會再用它 比沒有電腦還要寂寞
而那些點亮我們生命的作業系統 就彷彿電影中發生在暹邏的愛情故事
即使短暫使用也會刻骨銘心
--
Tags:
Linux
All Comments
![Dinah avatar](/img/girl2.jpg)
By Dinah
at 2017-09-10T14:03
at 2017-09-10T14:03
![Caitlin avatar](/img/girl3.jpg)
By Caitlin
at 2017-09-13T15:46
at 2017-09-13T15:46
![Hamiltion avatar](/img/beret.jpg)
By Hamiltion
at 2017-09-17T08:34
at 2017-09-17T08:34
![Joseph avatar](/img/boy1.jpg)
By Joseph
at 2017-09-18T17:24
at 2017-09-18T17:24
Related Posts
set問題詢問
![Hedda avatar](/img/woman-glasses.jpg)
By Hedda
at 2017-09-09T19:09
at 2017-09-09T19:09
Ubutu 14.04 network-manager誤刪
![Connor avatar](/img/bee.jpg)
By Connor
at 2017-09-09T08:16
at 2017-09-09T08:16
限制主機對外連線
![Noah avatar](/img/girl4.jpg)
By Noah
at 2017-09-08T16:36
at 2017-09-08T16:36
一直出現init : missing runlevel
![John avatar](/img/cat1.jpg)
By John
at 2017-09-06T19:33
at 2017-09-06T19:33
ubuntu下玩Tomb Raider(R3 1300X + RX560
![Hedy avatar](/img/woman-glasses.jpg)
By Hedy
at 2017-09-05T21:31
at 2017-09-05T21:31