shell脚本问题

shell脚本问题

所以我完全按照教程告诉我的方式做这件事,但有些东西仍然不起作用......

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 ,这都会起作用吗?如果我把它称为“香蕉”和“$香蕉”,会有效吗?

是的,即使我称其为香蕉,它也能起作用...为什么?那么第一个任期的目的是什么?

老实说,这不是一个关于 shell 脚本的教程,而是一个关于 Linux 的一般教程,它只是有一些关于 shell 脚本的内容:)

相关内容