如果在脚本中执行 cd 应该有故障保护。如果不这样做,您可以在错误的目录中执行命令。
在您的尝试中,即使没有 for 循环,输出也是相同的,因为for file in home/TESTING仅home/TESTING作为参数传递给,for因此它只运行一次。在
for file in home/TESTING/*这种情况下会发生其他情况。
我使用 find 没有--maxdepth,因此它也会查找所有子目录以及*.txt文件。如果你只想$(find /home/TESTING/* -type f -name "*.txt")替换当前目录$(ls *.txt),只要你没有那个目录.txt就没有问题。
#!/bin/bash
# try cd to directory, do things upon success.
if cd /home/TESTING ;then
# set sequence number
let "x = 1"
# pass every file to for that find matching, sub directories will be also as there is no maxdeapth.
for file in $(find /home/TESTING/* -type f -name "*.txt") ; do
# print sequence number, and base file name, processed by variable substitution.
# basename can be used as well but this is bash built in.
echo "${x}${file##*/}"
# print file content, and put sequence number before each line with stream editor.
sed 's#^#'"${x}"'#g' ${file}
# increase sequence number with one.
let "x++"
done
# unset sequence number
unset 'x'
else
# print error on stderr
echo 'cd to /home/TESTING directory is failed' >&2
fi
变量替换:
还有更多我现在只选择了这 4 个,因为它们相似。
${var#pattern}- 从左侧删除匹配模式的文本后使用 var 的值
${var##pattern}- 与上面相同,但删除最长的匹配部分而不是最短的部分
${var%pattern}- 从右侧删除匹配模式的文本后使用 var 的值
${var%%pattern}- 与上面相同,但删除最长的匹配部分而不是最短的部分
所以${file##*/}将获取 $file 的变量并*在最后一个##斜杠之前删除每个字符/。$file变量值不会被这个修改,所以它仍然包含路径和文件名。
sed 's#^#'"${x}"'#g' ${file}sed 是一个流编辑器,有整本关于它的使用的书籍,对于这个特定的。它通常放在单引号中,因此's#^#1#g'将在文件中的每一行的开头添加 1。s是替换,^是文件的开头,1是文本,g是全局的,如果你不放在那里,只有第一个马赫会受到影响。
#是分隔符,也可以是其他,/例如。我刹车单引号让变量被使用并重新打开单引号。
如果你想替换一个文本,.txt 到 .php,你可以使用sed 's#\.txt#\.php#g' file,.有特殊含义,它可以替换任何单个字符,所以需要转义\,才能将其用作文本。else 不仅file.txt会匹配file1txt,也会匹配。
它可以是管道的,在这种情况下您不需要指定文件名,否则您必须提供至少一个文件名,在我们的情况下它是${file}包含文件名的变量。正如我提到的变量替换不是修改变量值,因此它仍然包含带有路径的文件名。