看板 Linux 關於我們 聯絡資訊
※ 引述《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 -- 這類語法,很特殊情況才會用到。 -- 如果真的愛一個作業系統 怎能不害怕不再能使用它 而我們必須接受現實 於是長大了 寂寞就是沒有了機會再用它 比沒有電腦還要寂寞 而那些點亮我們生命的作業系統 就彷彿電影中發生在暹邏的愛情故事 即使短暫使用也會刻骨銘心 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.39.221.164 ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1504965729.A.A33.html
Tverous: 大概都了解了 真的非常感謝前輩 謝謝 09/09 22:12
ddtsatan: 推 09/09 22:31
goldie: 我只知道 getopt 常用到 (搭配) set -- 09/09 22:49
losepacific: 讚讚。 09/10 02:08