63052


`:` で区切られたファイル(`/etc/passwd`)の各行から 6列目の値 (= home directory) を取り出して、  
以下のようにコマンドに渡したいです。

**/etc/passwd**

[code]

    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    ec2-user:x:1000:1000:EC2 Default User:/home/ec2-user:/bin/bash
    
[/code]

**実行したいコマンド**

[code]

    command /var/empty/sshd /home/ec2-user
    
[/code]

`split` 系の記事を見るとどれも `tr ',' '\n'`
でスペースに分けてゴニョゴニョするものばかりなので、元々スペースを含むファイルだとうまく行きません。

Python や Ruby
のワンライナーを使ってしまえば簡単なんですが、プロビジョニングに使いたいのでそれらがインストールされてないサーバーにも適用したく、できれば基本コマンドだけで実現する方法はないでしょうか。


CC BY-SA 4.0
2020-02-14T11:11:13.943
63050
2020-03-06T04:53:48.880
2020-03-05T17:13:38.070
3060
question
shellscript
スペースの入った行をスペース以外の区切り文字で分割してコマンド引数に渡したい


「基本コマンド」ってどのへんまでを想定しているのかわからなかったのですが、  
awkとxargsを使えば次のようになります。  
(とりあえず「echo」を付けましたがcommandを直接実行するなら「echo」は外してください)

[code]

    $ awk -F: '{print $6}' /etc/passwd | xargs echo command
    
[/code]


CC BY-SA 4.0
2020-02-14T11:24:47.877
63052
2020-02-14T11:24:47.877
30745
63050
answer


シェルスクリプトで実現するならば、  
シェル変数「`IFS`」を「`:`」にすることで、「`:`」を区切り文字として`read`で各フィールドを読み込めると思います。

[code]

    # 例
    cat /etc/passwd | while IFS=: read user x uid gid username homedir loginshell ; do
        # 第6フィールドの値をcommandに渡す
        command "${homedir}"
    done
    
[/code]


CC BY-SA 4.0
2020-02-14T11:28:14.133
63053
2020-03-06T04:53:48.880
2020-03-06T04:53:48.880
3061
20098
63050
answer


6番目のフィールドを${command}に渡すスクリプトです。user20098さんのコードを参考にしました。

【スクリプト】

[code]

    #!/bin/bash
    IFS=":"
    cat /etc/passwd | while read line; do
        set ${line}
        ${command} ${6}
    done
    
[/code]

【使用例:echo コマンドを実行する場合】

[code]

    command=echo スクリプト
    
[/code]

* * *

ファイル、区切り記号、フィールドを外から指定可能にしてみました。

【スクリプトその２】

[code]

    #!/bin/bash
    IFS="${delimiter}"
    cat ${file} | while read line; do
        set ${line}
        eval ${command}
    done
    
[/code]

【使用例】

[code]

    command='printf "home=%s\n" $6' delimiter=: file=/etc/passwd ./スクリプトその２
    
[/code]


CC BY-SA 4.0
2020-02-14T15:46:47.700
63057
2020-02-14T16:48:31.403
2020-02-14T16:48:31.403
35558
35558
63050
answer


既出ですが、 `awk` ですね。

[code]

    $ cat /etc/passwd | awk -F: '{ print "command",$6,$7 }'
    command /var/empty/sshd /sbin/nologin
    command /home/ec2-user /bin/bash
    
[/code]


CC BY-SA 4.0
2020-02-18T23:32:08.190
63162
2020-02-18T23:32:08.190
34583
63050
answer