2

私はここでガイドを読んでいます http://mywiki.wooledge.org/BashFAQ/030 このリンクでいくつかの例が与えられています 私はそれらを理解しようとしています 1つの例のコードは言う

# Bash
# Replace all spaces with underscores
for f in *\ *; do mv -- "$f" "${f// /_}"; done

私が今まで知っていたのは、検索と置換の例の場合、または上記の例のシェルスクリプトでスラッシュを使用した場合に、〜や # などのスペースのような特殊文字にバックスラッシュを使用することでし た
${f// /_}
許可された?
同じページの別の例では、スペースを削除してアンダースコアに置き換える例を示しています

find . -depth -name "* *" -exec bash -c 'dir=${1%/*} base=${1##*/};
mv "$1" "$dir/${base// /_}"' _ {} \;


上記の例では、次の1) dir=${1%/*}
2) base=${1##*/}
3) で明確ではありませんmv "$1"。上記のステートメントで $1 が意味するものを言うと、
4) 最後に、find コマンドが閉じられ-exec <something> _ {} \;
、アンダースコア _ ,curly の使用は何ですか?中かっこ {} とバックスラッシュの後に \;? の上のコロン
3番目の例では、彼らは言います

# tolower - convert file names to lower case
# POSIX
for file in "$@"do 
   [ -f "$file" ] || continue                # ignore non-existing names   
 newname=$(echo "$file" | tr '[:upper:]' '[:lower:]')     # lower case   
 [ "$file" = "$newname" ] && continue      # nothing to do   
 [ -f "$newname" ] && continue             # don't overwrite existing files  
  mv -- "$file" "$newname"done 

私は次の行で明確では
あり[ -f "$file" ] || continue # ignore non-existing names
ません here と continue ステートメント
6)[ -f "$newname" ] && continue # don't overwrite existing filesポイント 5 と同じ疑問

4

2 に答える 2

1
${f// /_}

意味: 出現するすべてのスペースをアンダースコアに置き換える

ref


${1%/*}

/*手段:文字列の末尾からの最短一致を削除

ref


${1##*/}

*/意味:文字列の先頭からの最長一致を削除します

ref


mv "$1"$1 の意味を言うとき

$1最初の定位置パラメーターです。したがって、スクリプトにこれがある場合

echo $1

そして、あなたはこのように呼び出します

foo.sh 111

出力は次のようになります

111

最後に、find コマンドが閉じられ-exec <something> _ {} \; ます。アンダースコア_、中括弧{}、およびバックスラッシュとそれに続くコロンの使用は何\;ですか?

アンダースコアはパラメーターのプレースホルダーです$0

ref

この{} \;イディオムは、次のように使用さfindれます: ファイルごとにこのコマンドを 1 回実行します。

ref


[ -f "$file" ] || continue

意味:$fileが FILE でない場合、続行します (ループの現在の繰り返しをすぐに終了し、次の繰り返しを開始します)

ref

于 2013-03-09T08:45:01.490 に答える
1

置換に関する最初の質問については、 from からman bash:

${パラメータ/パターン/文字列}

 Pattern substitution. ... If pattern begins with /, all matches
of  pattern  are replaced   with  string.   Normally  only
the  first  match  is replaced.

つまり、in${parameter/pattern/string}の最初の出現をで置き換え、 whereはすべての一致を置き換えます。patternparameterstring${parameter//pattern/string}

2 番目のセクションの場合:

  1. dir=${1%/*}

    $1はスクリプトの最初の引数であり、その同等の を介してアクセス${1}できます。これにより、 のようなパラメーター展開が可能になり%...ます。${1}/*

  2. base=${1##*/}

    ##これにより、パターンを考慮して、一致する最長のプレフィックスが削除され*/ます。これは、 inx="a/b/c/d"が;${x##*/}を与えることを意味します。d

  3. 前に指摘したように、$1スクリプトの最初の引数です。

  4. バックスラッシュの後にコロンが続くのは純粋な構文であり-exec ...、コマンド ラインの解析を停止するために必要です。つまり、コマンドの末尾を指すために必要です。

  5. それはどういうわけか、完全に自己完結型です。条件、or演算子、および演算子の 2 番目の部分があり、全体として次のように読み取ることができます。

    $file が存在する場合、次の行に移動するか、そうでない場合は続行します (for ループの現在の繰り返しをスキップします)。

  6. あなたが指摘したように、演算子を除いて、ケースはまったく同じです。これにより、今回は次のように解釈されます。

    $newname という名前のファイルが既に存在する場合は、次の繰り返しにスキップします。

    別の読み方は、

    $newname という名前のファイルが存在し、次の繰り返しにスキップします。

パラメーター展開に関する最初の質問の詳細については、 を参照してくださいman bash | less -p "Parameter Expansion"

于 2013-03-09T08:31:09.617 に答える