フォルダ内の最後のファイルを繰り返してコマンドを実行するスクリプトを作成しています。
#!/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
エラーメッセージにすべてが記載されています。ただし、後でこれらの問題を解決するのに役立ついくつかの作業があります。
- 次のようにエラーが発生する行をコメントアウトします。
最近のファイル = ($(ls -t | ヘッダー-20))
そして走る
bash -n myScript.sh
スクリプトにエラーがないか確認してください。
次のコードブロックをコメントアウトします。
: << 'EOF' lines of code EOF
そして走る
bash -n myScript.sh
この方法では、スクリプトで誤った行を拡大できます。
あなたの特定の質問に戻り、多くの人々はすでに問題の原因が何であるか、つまり=
ロゴの周りのスペースに答えています。