'はディレクトリ名を関数

iv class = “question”に渡そうとしたときのディレクトリ'エラーです>

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 

どうやら、プログラムが実行しようとしているためです。ディレクトリですが、操作できる文字列として使用したいだけです。

コメント

  • うーん…. bashのmanページによると。 … bashのreturn組み込みコマンドは、任意のタイプの文字列パラメーターではなく、EXITコード(整数)を返すために使用されます。
  • find "${directory}" -mindepth 1 -type d -name "${wildcard}" -print0 | xargs -0 doStuff
  • googlers :このエラーメッセージを取得するためのもう1つの優れたソースgeは、#a correct bash line comment

回答

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 'は
  • ではありません

回答

これは良い努力ですが、bashプログラミング言語であるかのように、実際には単純なスクリプト言語です。 stuff=doStuff argの構築に関する問題は、bashにとってそれがあなたが考えていることを意味しないということです。 bashに対して、stuff=doStuffは変数の割り当てであり、argはコマンドです。次の2つのリンクを読むことをお勧めします。

現在のバージョンと同様の作業バージョン

doStuff () { echo "$1/hello" } stuff=$(doStuff "$i") 

回答

エラーを示す行は、思ったとおりに機能しません。

最初に環境変数を文字列 “doStuff”に設定し、次に$ {i}をコマンドとして実行しようとします。また、$ {i}はディレクトリであるため、指定されたエラーメッセージで失敗します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です