如果在脚本中执行 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}
包含文件名的变量。正如我提到的变量替换不是修改变量值,因此它仍然包含带有路径的文件名。