你好我在这里学习脚本。我正在尝试使用“for”循环编写一个简单的脚本。
我在一个名为 user 的文件夹中有数百个文件夹。
如果我运行这个命令,我会得到一个需要移动到另一个文件夹的文件夹列表
cat failed | awk -F ":" '/FAILED/ {print $1}' | uniq
即,任务失败的用户下的文件夹必须移动到 users/failed/failedusers
我目前正在做的是我首先使用创建一个新文件
cat failed | awk -F ":" '/FAILED/ {print $1}' | uniq > failedusers
然后我使用以下命令移动文件夹
while read line; do cp -r users/$line users/failed; done < failedusers
我的问题是我可以只使用for命令而不是将输出写入另一个文件并使用while read命令来完成它吗?
例如,以某种方式为循环中的变量赋值
faileduser=`cat failed | awk -F ":" '/FAILED/ {print $1}' | uniq`
然后写类似
mv users/$faileduser user/failed/$faileduser
当我尝试写类似上面的东西时,我遇到了各种各样的错误。
谢谢
使用 GNU
xargs
和支持 ksh 样式进程替换的 shell,您可以执行以下操作:使用
zsh
,您可以执行以下操作:假设您要复制
USER
到user/failed/USER
,即复制到user/failed
,您也可以这样做(仍然使用zsh
):使用
bash
shell,您可以执行类似的操作:或者在所有用户名
awk
前面加上:user/
使用
for
循环,使用类似 Korn 的 shell(包括bash
,也可以使用zsh
),语法将是:其中 in
zsh
可以缩短为:和:
(
`...`
作为命令替换的古老和不推荐的形式。$(...)
改用)。您将
awk
's 的输出存储在标量中,而不是数组变量中。在
zsh
中,您可以使用参数扩展标志在换行符上拆分它,f
就像我们直接在上面的命令替换中所做的那样:在 bash(或 ksh)中,您可以在禁用 glob 并调整拆分后使用 split+glob 运算符:
(是的, in
bash
,不引用参数扩展会调用隐式 split+glob 运算符 (!),这是从 Bourne shell 继承的错误功能,在 zsh 和大多数现代非 Bourne-like shell 中已修复)。