bash while循环不处理文件内容

时间:2017-11-08 00:19:08

标签: bash while-loop

我有一个由管道分隔的shell脚本列表:

casper_one.sh|casper_two.sh|casper_three.sh|casper_four.sh|casper_five.sh

我要做的是在每个脚本名前面打印一个绝对路径:

/home/casper/scripts/casper_one.sh
/home/casper/scripts/casper_two.sh
/home/casper/scripts/casper_three.sh
/home/casper/scripts/casper_four.sh
/home/casper/scripts/casper_five.sh

我尝试了这个,但是(正如你所看到的)它不起作用:

while IFS="|" read -r line ; do
  start="/home/casper/scripts/"
  echo "$start$line"
done < casper_one.sh|casper_two.sh|casper_three.sh|casper_four.sh|casper_five.sh

-bash: casper_one.sh: No such file or directory
-bash: casper_two.sh: command not found
-bash: casper_four.sh: command not found
-bash: casper_three.sh: command not found
-bash: casper_five.sh: command not found

当我将脚本名称放入文件然后将其转换为循环时,shell会抛出File name too long错误:

while IFS="|" read -r line ; do
  start="/home/casper/scripts/"
  echo "$start$line"
done < $(cat /tmp/casper.txt) 
File name too long

3 个答案:

答案 0 :(得分:0)

我不会重复关于你的符号的评论,这里有几个解决方案,还有很多其他解决方案。

我将start移到了循环之外,因为它没有改变(为什么每次迭代都设置它?)。

start="/home/casper/scripts/"
line='casper_one.sh|casper_two.sh|casper_three.sh|casper_four.sh|casper_five.sh'

oldIFS="$IFS"
IFS="|"
for name in $line
do
  echo "$start$name"
done
IFS="$oldIFS"

这使用文件和数组:

start="/home/casper/scripts/"
IFS="|" read -a names < /tmp/casper.txt

for name in "${names[@]}"
do
  echo "$start$name"
done

read -a读入数组,按IFS中的字符分割。在这种情况下,数组称为names

"${names[@]}"表示法给出了数组中所有元素的列表。

答案 1 :(得分:0)

这是一个不错的单行:

-maxdepth 1

这将输出以下绝对路径:

variable="$(find /home/casper/scripts/ -maxdepth 1 -name 'casper_*.sh')"

这将递归搜索限制为仅限于该目录(如果您在任何子目录中有任何casper .sh文件)。如果要搜索子目录,请删除find /home/casper/scripts/ -maxdepth 1 -name 'casper_*.sh' > /tmp/casper_output.tmp 部分。

您可以将此命令的输出放入如下变量中:

{{1}}

或者你可以将它导出到这样的临时文件:

{{1}}

答案 2 :(得分:-1)

晚上,你可以这样做:

#!/bin/bash
#
IFS="|"
path="some/path/prefix"

scripts="casper_one.sh|casper_two.sh|casper_three.sh|casper_four.sh|casper_five.sh"

for script in $scripts
do
    echo $path/$script
done

for循环在这种情况下很容易使用,因为它会自动遍历值,由IFS的值分隔。这看起来很像Python,PHP和其他的foreach循环。

如果您想通过文件:

casper.txt:

  

casper_one.sh | cas​​per_two.sh | cas​​per_three.sh | cas​​per_four.sh | cas​​per_five.sh

然后脚本变为:

#!/bin/bash
#
IFS="|"
path="some/path/prefix"

for script in $(cat casper.txt)
do
    echo $path/$script
done