set問題詢問 - Linux

Christine avatar
By Christine
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 -- 這類語法,很特殊情況才會用到。

--
如果真的愛一個作業系統 怎能不害怕不再能使用它 而我們必須接受現實
於是長大了 寂寞就是沒有了機會再用它 比沒有電腦還要寂寞
而那些點亮我們生命的作業系統 就彷彿電影中發生在暹邏的愛情故事
即使短暫使用也會刻骨銘心

--
Tags: Linux

All Comments

Dinah avatar
By Dinah
at 2017-09-10T14:03
大概都了解了 真的非常感謝前輩 謝謝
Caitlin avatar
By Caitlin
at 2017-09-13T15:46
Hamiltion avatar
By Hamiltion
at 2017-09-17T08:34
我只知道 getopt 常用到 (搭配) set --
Joseph avatar
By Joseph
at 2017-09-18T17:24
讚讚。

set問題詢問

Hedda avatar
By Hedda
at 2017-09-09T19:09
各位前輩打擾了 想在這請教兩個問題 第一個是有關set的用法 不太懂的是關於set -- 查詢之後似乎是說: set -- tells set to stop accepting flags and to stop outputting all the variables when not passe ...

Ubutu 14.04 network-manager誤刪

Connor avatar
By Connor
at 2017-09-09T08:16
請問不小心誤刪到network-manager sudo apt-get network-manager remove 結果右上角網路圖示消失, 進入系統設定andgt;網路裡面的WIFI跟WIRE都消失了, 嘗試手動下載network-manager的deb手動安裝, 變成network-manager ...

限制主機對外連線

Noah avatar
By Noah
at 2017-09-08T16:36
想請問前輩們, 限制外面連入主機的ip可設定 /etc/hosts.allow /etc/hosts.deny 如果相反的, 要去限制主機對外連線該如何設定?? (僅開放主機能對特定IP傳輸資料, 其餘關閉) - ...

一直出現init : missing runlevel

John avatar
By John
at 2017-09-06T19:33
大家好 請問一下最近學校的工作站都沒辦法使用XDMCP, 發現是init沒辦法設定成5, 下init --verbose後出現 init: missing runlevel etc/inittab檔案內也有id:5:initdefault: 請問這要怎麼解決呢? 感謝 - ...

ubuntu下玩Tomb Raider(R3 1300X + RX560

Hedy avatar
By Hedy
at 2017-09-05T21:31
※ [本文轉錄自 PC_Shopping 看板 #1Phg8DCb ] 作者: RHTZ (愛在西元前) 看板: PC_Shopping 標題: [測試] ubuntu下玩Tomb Raider(R3 1300X + RX560 時間: Tue Sep 5 21:09:28 2017 網頁好讀:http ...