我有一个由管道分隔的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
答案 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 | casper_two.sh | casper_three.sh | casper_four.sh | casper_five.sh
然后脚本变为:
#!/bin/bash
#
IFS="|"
path="some/path/prefix"
for script in $(cat casper.txt)
do
echo $path/$script
done