作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个目录 config
,其中包含以下文件列表:
$ ls config
file one
file two
file three
我想要一个 bash 脚本,当没有给定参数时,它会遍历所有这些文件;当给定文件名作为参数时,我希望它遍历命名文件。
#!/bin/sh
for file in ${@:-config/*}
do
echo "Processing '$file'"
done
如上所述,for 循环中的列表项周围没有引号,它在无参数情况下会产生预期的输出,但在您传递参数时会中断(它会在空格处拆分文件名。) term (for file in "${@:-config/*}"
) 在我传递文件名时有效,但如果不传递则无法扩展 glob。
有没有办法让这两种情况都起作用?
最佳答案
对于更简单的解决方案,只需修改您的 IFS 变量
#!/bin/bash
IFS=''
for file in ${@:-config/*}
do
echo "Processing '$file'"
done
IFS=$' \n\t'
$IFS
是一个默认的 shell 变量,它列出了 shell 使用的所有分隔符。如果您从此列表中删除空格,shell 将不再按空格拆分。您应该在运行后将其设置回默认值,这样它就不会导致其他函数稍后在您的脚本中运行不正常
注意:这似乎与破折号有关(我使用的是 debian,并且 #!/bin/sh
链接到破折号)。如果您使用空的 $IFS
,传递的参数将仅作为 1 个文件返回。但是,如果您输入一些随机值(即 IFS=':'
),行为将是您想要的(除非您的文件名中有 :
)
尽管 #!/bin/bash
可以正常工作
关于bash - 遍历目录中的所有文件,或仅遍历 sh 中的指定文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23824621/
我是一名优秀的程序员,十分优秀!