実現したいこと
たとえば ./command.sh prefix:arg1 prefix:arg2
という形式をとる command.sh があるとして、
その中で ./another_command.sh arg1 arg2
というように引数からそのまま prefix:
を除いたものを引数にとるコマンドを実行したいとします。
このときに引数から prefix:
を消したものを表示する別のスクリプトを用意して
prefix_eraser.sh:
sh
1#!/bin/bash 2modified=() 3 4for arg in "$@"; do 5 arg=$(echo "$arg" | sed -e 's;^prefix:;;') 6 modified+=("$arg") 7done 8 9echo "${modified[@]}"
使うときには command.sh で ./another_command.sh $(./prefix_eraser.sh "$@")
とかすればいいのでは、と思ったのですが、もともとの引数に空白が含まれていると、 another_command.sh に渡るときには分割されて渡されてしまいます。
たとえば具体的に command.sh と another_command.sh を
command.sh
sh
1#!/bin/bash 2 3./another_command.sh $(./prefix_eraser.sh "$@")
another_command.sh
sh
1#!/bin/bash 2 3for arg in "$@"; do 4 echo $arg 5done
のようにすると、
sh
1$ ./another_command.sh prefix:a prefix:b\ c prefix:c 2prefix:a 3prefix:b c 4prefix:c 5 6$ ./command.sh prefix:a prefix:b\ c prefix:c 7a 8b 9c 10c
command.sh 内の $(./prefix_eraser.sh "$@")
が展開されるときには '\ '
もただの空白になっているのが原因だと思いますが、この「一つの引数の区切り」情報を維持したまま渡すことはできないのでしょうか?
長くなりましたが、どうかよろしくお願いします。
試したこと
prefix_eraser.sh で echo "${modified[@]}"
のようには出力せず for で回しながら一つずつ改行区切りで出力させて another_command.sh の中で IFS を改行だけにしてから新しい配列を用意し for で回しながら配列に追加、また "${modified[@]}"のようにして文字列化する、という方法ならば区切りを保持できましたが、いかんせん面倒なのでサクっとできる方法はないのかと思った次第です。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/23 13:12