标签: for

为什么循环查找的输出是不好的做法?

这个问题的灵感来自

为什么使用 shell 循环处理文本被认为是不好的做法?

我看到这些结构

for file in `find . -type f -name ...`; do smth with ${file}; done
Run Code Online (Sandbox Code Playgroud)

for dir in $(find . -type d -name ...); do smth with ${dir}; done
Run Code Online (Sandbox Code Playgroud)

几乎每天都在这里使用,即使有些人花时间对这些帖子发表评论,解释为什么应该避免这种东西......
看到此类帖子的数量(以及有时这些评论被简单地忽略的事实)我想我还不如问一个问题:

为什么循环find的输出是不好的做法,为 返回的每个文件名/路径运行一个或多个命令的正确方法是find什么?

find filenames files for

193
推荐指数
4
解决办法
3万
查看次数

Bash for 循环中“do”关键字的用途是什么?

doBashfor循环语法中关键字的用途是什么?对我来说,感觉是多余的。

for i in `seq 1 2`; do echo "hi"; done
Run Code Online (Sandbox Code Playgroud)

为什么不是这样的语法?

for i in `seq 1 2`; echo "hi"; done
Run Code Online (Sandbox Code Playgroud)

我确信它确实达到了目的。我只是想学习。

shell bash for

80
推荐指数
1
解决办法
9580
查看次数

在bash中,是否可以在大括号扩展中使用整数变量

我有以下 bash 脚本:

#!/bin/bash

upperlim=10

for i in {0..10}
do
echo $i
done

for i in {0..$upperlim}
do
echo $i
done
Run Code Online (Sandbox Code Playgroud)

第一for回路(没有变量upperlim中的循环控制)工作正常,但所述第二for环路(可变upperlim的循环控制)没有。有什么办法可以修改第二个for循环以使其正常工作吗?谢谢你的时间。

shell bash shell-script for

78
推荐指数
3
解决办法
8万
查看次数

在 bash shell 脚本中,编写一个遍历字符串值的 for 循环

在 bash 中,我知道可以编写一个for循环,其中一些循环控制变量i迭代指定的整数。例如,我可以编写一个 bash shell 脚本来打印 1 到 10 之间的整数:

#!/bin/bash

for i in {1..10}
do
 echo $i
done
Run Code Online (Sandbox Code Playgroud)

如果我提供字符串列表,是否可以迭代作为字符串的循环控制变量?例如,假设我有一个fname表示文件名的字符串。我想为每个文件名调用一组命令。例如,我可能想fname使用这样的命令打印内容:

#!/bin/bash

for fname in {"a.txt", "b.txt", "c.txt"}
do
 echo $fname
done
Run Code Online (Sandbox Code Playgroud)

换句话说,在第一次迭代时,fname应该有 value fname="a.txt",而在第二次迭代时,fname应该有 value fname="b.txt",依此类推。不幸的是,上面的语法似乎不太正确。我想获得输出:

一个.txt

b.txt

文件

但是当我尝试上面的代码时,我得到了这个输出:

{a.txt,

b.txt,

c.txt}

你能帮我确定正确的语法,以便我可以迭代地更改变量的值/内容fname吗?感谢您的时间。

bash shell-script for

28
推荐指数
1
解决办法
9万
查看次数

如何在 for 循环中替换 AND (&&)?

我想找到一个等价的

cmd 1 && cmd 2 && ... && cmd 20
Run Code Online (Sandbox Code Playgroud)

但是在一个for循环中表达的命令就像

for i in {1..20}
do
   cmd $i
done
Run Code Online (Sandbox Code Playgroud)

您建议在第二个表达式中更改什么以找到与第一个相同的表达式?

shell scripting bash shell-script for

26
推荐指数
3
解决办法
4320
查看次数

避免因未扩展的星号而导致的错误

在 bash 中,我经常使用 for 循环,如下所示

for file in *.type; do 
  sommecommand "$file"; 
done;
Run Code Online (Sandbox Code Playgroud)

对所有匹配的文件执行操作*.type。如果在工作目录中没有找到具有此结尾的文件,则星号不会展开,通常我会收到一条错误消息,指出 somecommand 没有找到该文件。我可以立即想到几种方法来避免这个错误。但是添加一个条件似乎不是很优雅。有没有一种简短而干净的方法来实现这一目标?

bash wildcards for

20
推荐指数
3
解决办法
3940
查看次数

${!FOO} 和 zsh

${!FOO}在 中执行双重替换bash,这意味着它采用 FOO 的(字符串)值并将其用作变量名。
zsh不支持此功能。

有没有办法使这项工作在bash和 中相同zsh

背景:

我有一个环境变量列表,比如

PATH MAIL EDITOR
Run Code Online (Sandbox Code Playgroud)

并且想先打印变量名,然后打印它们的值。

这适用于bash但不适用于zsh

PATH MAIL EDITOR
Run Code Online (Sandbox Code Playgroud)

应该以某种方式可能以“旧方式”使用eval,但我无法让它工作:

for VAR in LIST
do
        echo $VAR
        echo ${!VAR}
done
Run Code Online (Sandbox Code Playgroud)

我永远不会明白为什么我不能简单地进行任意深度替换,例如${${VAR}}或即使${${${VAR}}}需要,所以对此的解释也很好。

bash zsh variable-substitution for

18
推荐指数
2
解决办法
7587
查看次数

for循环范围内的bash变量

我想打印从 1 到 100 的数字列表,并使用如下所示的 for 循环:

number=100
for num in {1..$number}
do
  echo $num
done
Run Code Online (Sandbox Code Playgroud)

当我执行命令时,它只打印 {1..100} 而不是从 1 到 100 的数字列表。

bash for

18
推荐指数
2
解决办法
10万
查看次数

遍历目录中内容的正确方法

我需要遍历目录中的每个文件。我看到的一种常见方法是使用以for file in *; do. 但是,我意识到它不包括隐藏文件(以“.”开头的文件)。另一个明显的方法是做类似的事情

for file in `ls -a`; do
Run Code Online (Sandbox Code Playgroud)

然而,迭代ls是一个坏主意,因为文件名中的空格会把一切搞砸。遍历目录并获取所有隐藏文件的正确方法是什么?

ls shell-script wildcards dot-files for

17
推荐指数
1
解决办法
8万
查看次数

遍历文件夹并列出文件

我有一个名为“sample”的文件夹,里面有 3 个文件。我想编写一个 shell 脚本,它将读取示例文件夹中的这些文件,并使用 curl 将其发布到 HTTP 站点。

我编写了以下内容来列出文件夹中的文件:

for dir in sample/*; do
        echo $dir;
        done
Run Code Online (Sandbox Code Playgroud)

但它给了我以下输出:

sample/log

sample/clk

sample/demo
Run Code Online (Sandbox Code Playgroud)

它正在附加父文件夹。我希望输出如下(没有父文件夹名称)

log

clk

demo
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

directory shell-script files for

14
推荐指数
1
解决办法
19万
查看次数