这个问题的灵感来自
我看到这些结构
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什么?
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)
我确信它确实达到了目的。我只是想学习。
我有以下 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循环以使其正常工作吗?谢谢你的时间。
在 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吗?感谢您的时间。
我想找到一个等价的
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)
您建议在第二个表达式中更改什么以找到与第一个相同的表达式?
在 bash 中,我经常使用 for 循环,如下所示
for file in *.type; do
sommecommand "$file";
done;
Run Code Online (Sandbox Code Playgroud)
对所有匹配的文件执行操作*.type。如果在工作目录中没有找到具有此结尾的文件,则星号不会展开,通常我会收到一条错误消息,指出 somecommand 没有找到该文件。我可以立即想到几种方法来避免这个错误。但是添加一个条件似乎不是很优雅。有没有一种简短而干净的方法来实现这一目标?
${!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}}}需要,所以对此的解释也很好。
我想打印从 1 到 100 的数字列表,并使用如下所示的 for 循环:
number=100
for num in {1..$number}
do
echo $num
done
Run Code Online (Sandbox Code Playgroud)
当我执行命令时,它只打印 {1..100} 而不是从 1 到 100 的数字列表。
我需要遍历目录中的每个文件。我看到的一种常见方法是使用以for file in *; do. 但是,我意识到它不包括隐藏文件(以“.”开头的文件)。另一个明显的方法是做类似的事情
for file in `ls -a`; do
Run Code Online (Sandbox Code Playgroud)
然而,迭代ls是一个坏主意,因为文件名中的空格会把一切搞砸。遍历目录并获取所有隐藏文件的正确方法是什么?
我有一个名为“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)
我该怎么做呢?