私のBashスクリプトが構文エラーを返すのはなぜですか? [コピー]

私のBashスクリプトが構文エラーを返すのはなぜですか? [コピー]

フォルダ内の最後のファイルを繰り返してコマンドを実行するスクリプトを作成しています。

#!/bin/bash
cd /home/Downloads
recent_files = ($(ls -t | head -20))
for file in "${recent_files[@]}"
do
    ./cmd $file
done

次の構文エラーが発生します。

line 3: syntax error near unexpected token `('
line 3: `recent_files = ($(\ls -t | head -20))'

答え1

Bash変数の割り当てスキームは追加のvar=valueスペースを許可しません。

これを削除すると、ls -t | head -20出力は配列として正しく割り当てられます。

したがって、スクリプトは次のようにする必要があります。

#!/bin/bash
cd /home/Downloads
recent_files=($(ls -t | head -20))
for file in "${recent_files[@]}"
do
    ./cmd $file
done

答え2

出力を変数に保存する必要はありません。

cd /home/Downloads
command ls -t | head -20 | while read -r file; do
    ./cmd "$file"
done

でも

command ls -t | head -20 | xargs -L 1 ./cmd

より安全な作業方法はを使用することですstat。それでも改行文字を含むファイル名から保護されていません。

stat -c "%Y %n" * | sort -rn | head -20 | cut -d" " -f2- | xargs -L 1 ./cmd

確かに言えば、findヌルバイトを処理するためにGNUツールが必要かもしれません。

find . "${find_options[@]}" -printf '%T@ %p\0' | 
sort -zrn |
xargs -0 -L 1 sh -c './cmd "$(echo "$0" | sed "1s/^[0-9.]\\+ //")"'

このfind_options配列は、フィルタリングガイドラインを追加するためのプレースホルダとして使用できます。

find_options=( -type f )
find_options+=( -maxdepth 1 )
find_options+=( -name '*.txt' )

など。

答え3

等号の周囲のスペースを削除する必要があります。

recent_files=($(ls -t | head -20))

それではうまくいきます。

答え4

エラーメッセージにすべてが記載されています。ただし、後でこれらの問題を解決するのに役立ついくつかの作業があります。

  1. 次のようにエラーが発生する行をコメントアウトします。
最近のファイル = ($(ls -t | ヘッダー-20))

そして走る

bash -n myScript.sh

スクリプトにエラーがないか確認してください。

  1. 次のコードブロックをコメントアウトします。

    : << 'EOF'
    lines
    of
    code
    EOF
    

そして走る

bash -n myScript.sh

この方法では、スクリプトで誤った行を拡大できます。

あなたの特定の質問に戻り、多くの人々はすでに問題の原因が何であるか、つまり=ロゴの周りのスペースに答えています。

関連情報