シェルスクリプトの問題[閉じる]

シェルスクリプトの問題[閉じる]

そのため、チュートリアルでお知らせしたとおりに正確に行ったが、まだ動作しない問題があります。

1 #!/bin/bash
2 users=$(ls *.usr)
3 date=$(date +%F)
4 for usr in $users
5 do
6 mv ${usr} ${date}-${users}
7 done

ディレクトリの内容は次のとおりです。

1.sh   fila2  fila6  file3  log1         marty1.usr  marty5.usr  marty9.usr  user3
2.sh   fila3  file0  file4  marty0.usr   marty2.usr  marty6.usr  user0       user4
fila0  fila4  file1  file5  marty10.usr  marty3.usr  marty7.usr  user1       user5
fila1  fila5  file2  file6  marty11.usr  marty4.usr  marty8.usr  user2       user6

私のスクリプトは、.usrで終わるすべてのファイルの名前を名前の前に日付が含まれるように変更する必要がありますが、代わりに次のエラーが発生します。

mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory 
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory

繰り返しますが、どこにもmarty9.usrというフォルダを作成するように頼まないことを考えると、私が何を間違っているのかわかりません。

答え1

これはあなたのチュートリアルですしなければならないあなたに言う:

#!/bin/bash
date=$(date +%F)
for file in *.usr
do
    echo moving "$file" to "$date-$file"
    mv "$file" "$date-$file"
done

どこ

  • lsファイル名を繰り返す必要はありません。
  • パターンに一致するファイルを直接繰り返します。
  • トークン化とファイル名拡張から自分自身を保護するために変数を引用します。

答え2

だから明らかに私が間違っていた

   6 mv ${usr} ${date}-${users}

やらなければならなかった

   6 mv ${usr} ${date}-${usr}

しかし、私はこれがなぜ機能するのかまだ理解していません。私はusrがどこにあるのかスクリプトに話しませんでした。私が言わなかったときにusrがファイル名であることをどうやって知ることができますか? "for usr in $users"は私には理解されていません...

それでは、私がusrと$ usrと呼んでいても、これはうまくいきますか? 「banana」と「$banana」と呼ぶと効果があるでしょうか?

はい、バナナと呼んでもいいですね…なぜ?それでは、最初の用語の目的は何ですか?

正直に言うと、これはシェルスクリプトのチュートリアルではなく、Linuxの一般的なチュートリアルであり、シェルスクリプトに関するほんのいくつかだけを含んでいます。 :)

関連情報