bashスクリプトでは、findを使用してワイルドカードでフォルダー名を取得します。
for i in $(find ${directory} -mindepth 1 -type d -name ${wildcard}); do stuff=doStuff ${i} done doStuff() { echo ${1} return ${1}"/hello"; }
問題は、これを実行すると、次のようになります。次のエラー($ {i}が “home / me / my_directory”に対応するとします):
line 111: "/home/me/my_directory": is a directory.
(111行目は “doStuff”の行です”)
これを実行しようとしましたが、役に立ちませんでした:
for i in $(find ${directory} -mindepth 1 -type d -name ${wildcard}); do stuff=doStuff "${i}" done
どうやら、プログラムが実行しようとしているためです。ディレクトリですが、操作できる文字列として使用したいだけです。
コメント
回答
ivではなく//a wrong bash line comment
です。 class = “answer”>
引用符とコマンド置換がここでの問題です。
発生している特定の問題は、シェルが環境変数stuff=doStuff
を使用します。
本当に必要なのは(正しく解釈している場合)doStuff
の値を引数として$i
とし、出力を変数stuff
に割り当てます。これを行う方法は、コマンドを$()
でラップすることです。例:
stuff="$(doStuff "$i")"
注意すべてを引用符で囲む方法。これは、シェルが単語分割を望まないものを単語分割するのを防ぐためです(/foo/bar baz
の単一の引数を/foo/bar
およびbaz
)。
また、関数の出力は、return
。
より多くの引用符を使用する必要があるため、他のすべてにも引用符を追加する必要があります。スクリプトの完全なバージョンは次のとおりです。
doStuff() { echo "${1}" >&2 printf "%s/hello" "$1"; } IFS=$"\n" for i in $(find "${directory}" -mindepth 1 -type d -name "${wildcard}"); do stuff="$(doStuff "${i}")" done
使用する前に、関数定義を入力する必要があります。シェルはコンパイルされたプログラムのように解析されず、ファイルを数回処理します。トップダウンです。
doStuff
も変更して
はSTDERRに送信され、端末に表示されます。次に、printf
はSTDOUTに送信され、そこで変数
。
ディレクトリのいずれかに改行が含まれている場合でも問題が発生することに注意してください。ただし、これはシェルの制限です。ファイルパスで使用できない唯一の文字containsはNULL文字(\0
)です。ただし、bashやその他のシェルはNULL文字を文字列に格納できません(すべてではありませんが、多くあります。zshができることはわかっています)。区切り文字として使用します。
コメント
-
=
、それはめちゃくちゃです。例えばMY_VAR = ' / some / path 'は有効ですが、MY_VAR = ' / some / path 'またはMY_VAR = ' / some / path 'は
ではありません
find "${directory}" -mindepth 1 -type d -name "${wildcard}" -print0 | xargs -0 doStuff
#a correct bash line comment