Bash将反勾选前置到字符串
Bash在myStats行中不断添加一个`右前$corrected'。我怎样才能摆脱它 一点背景:我创建了一个脚本来循环search.txt中提供的文件,以提供统计信息,并将它们输出到一个新文件中。它工作得很好,但它在目录或文件中有空格的任何文件名上都会中断,因此我需要在文件路径中添加引号 出于某种原因,向文件路径添加引号会在路径的开头创建一个`符号,从而使整个脚本变得无用。substring$corrected没有帮助,myStats行中添加了`Bash将反勾选前置到字符串,bash,Bash,Bash在myStats行中不断添加一个`右前$corrected'。我怎样才能摆脱它 一点背景:我创建了一个脚本来循环search.txt中提供的文件,以提供统计信息,并将它们输出到一个新文件中。它工作得很好,但它在目录或文件中有空格的任何文件名上都会中断,因此我需要在文件路径中添加引号 出于某种原因,向文件路径添加引号会在路径的开头创建一个`符号,从而使整个脚本变得无用。substring$corrected没有帮助,myStats行中添加了` for i in $(cat search.t
for i in $(cat search.txt); do
corrected=\"$( echo "$i" )\"
echo $corrected
myStats="`stat $corrected | awk '( NR == 1 ) {print $1 $2 $3 $4 $5 $6 $7 $8};\
( NR == 2 ) {print $1 $2};\
( NR == 4 ) {print $3 $4 $5 $6 " " $7 $8 $9 $10 };\
( NR == 6 ) {print $1 $2 " " $3};'`"
echo $myStats >> "$myHostname"
done
search.txt中的示例:
/var/lib/tomcat5/webapps/isp.bak/usa.css
/var/lib/tomcat5/webapps/isp.bak/validationFunctions.js
有人有什么想法吗?谢谢
编辑:
I0b0提供了一个极好的解决方案,我还从大家那里了解了IFS。很抱歉没有包括输出,我完全忘记了。这是我更新的代码(现在压缩得多了),它的功能是查找这些文件扩展名,以查看需要在服务器上备份的内容
#Get file name as hostnameFiles.txt
myHostname="$(hostname)Files.txt"
#Write initial information to file
uname -n > "$myHostname"
echo "Script run on: " >> "$myHostname"
date -u >> "$myHostname"
echo "" >> "$myHostname"
#For each line from find, run stat and pull relevant information.
while IFS= read -r; do
#echo "$REPLY"
echo "$(stat "$REPLY" | awk '( NR == 1 ) {print $1 $2 $3 $4 $5 $6 $7 $8};\
( NR == 2 ) {print $1 $2};\
( NR == 4 ) {print $3 $4 $5 $6 " " $7 $8 $9 $10 };\
( NR == 6 ) {print $1 $2 " " $3};')" >> "$myHostname"
done < <(find / -iname "*.css" -or -iname "*.html" -or -iname "*.java" -or -iname "*.js" -or -iname "*.jsp" -or -iname "*.php" -or -iname "*.pl" -or -iname "*.py" -or -iname "*.rb" -or -iname "*.sql")
#获取文件名为hostnameFiles.txt
myHostname=“$(主机名)Files.txt”
#将初始信息写入文件
uname-n>“$myHostname”
echo“脚本运行时间:”>>“$myHostname”
日期-u>>“$myHostname”
echo”“>>“$myHostname”
#对于find中的每一行,运行stat并提取相关信息。
而IFS=read-r;做
#回显“$REPLY”
echo“$(统计“$REPLY”| awk”(NR==1){打印$1$2$3$4$5$6$7$8}\
(NR==2){打印$1$2}\
(NR==4){打印$3$4$5$6”“$7$8$9$10}\
(NR==6){print$1$2”“$3};')“>>“$myHostname”
完成<字符串和变量引用中存在大量语法/用法错误,可以很容易地解释您所发现的问题。如果您想编辑您的问题,那么查看您得到的实际输入和错误输出会很有帮助
无论如何,uou需要转义awk print语句中的“
字符,即
savIFS=${IFS}
IFS=
for i in $(cat search.txt); do
corrected=\"$( echo "$i" )\"
echo $corrected
myStats="$(
stat "$corrected" \
| awk '
( NR == 1 ) {print $1 $2 $3 $4 $5 $6 $7 $8};
( NR == 2 ) {print $1 $2};
( NR == 4 ) {print $3 $4 $5 $6 \" \" $7 $8 $9 $10 };
( NR == 6 ) {print $1 $2 \" \" $3}
'
)" # end myStats
echo "$myStats" >> "$myHostname"
done
IFS="${savIFS} ; unset savIFS
我还建议您在for循环中使用cat search.txt
时,将backtics命令替换为$(…)
我假设您不想丢失$myStats
的格式,因此我用dbl引号将其括起来。通常,所有变量引用,即$corrected,都应该用dbl引号括起来
很难确定我是否有这个权利,因为我没有时间创建名称中带有空格的测试文件并创建一个新的search.txt,但是如果在运行此代码时出现错误,我很乐意与您合作。${IFS}
可能是不必要的,但我的时间也差不多用完了
我希望这有帮助
另外,当您看起来是新用户时,如果您得到的答案有助于您,请记住将其标记为已接受,并/或将其作为有用的答案给予+(或-)。以下是一个简单的解决方案:
while IFS= read -r; do
echo "$REPLY"
echo "$(stat "$REPLY" | awk '( NR == 1 ) {print $1 $2 $3 $4 $5 $6 $7 $8};\
( NR == 2 ) {print $1 $2};\
( NR == 4 ) {print $3 $4 $5 $6 " " $7 $8 $9 $10 };\
( NR == 6 ) {print $1 $2 " " $3};')" >> "$myHostname"
done < search.txt
而IFS=read-r;do
回显“$REPLY”
echo“$(统计“$REPLY”| awk”(NR==1){打印$1$2$3$4$5$6$7$8}\
(NR==2){打印$1$2}\
(NR==4){打印$3$4$5$6”“$7$8$9$10}\
(NR==6){print$1$2”“$3};')“>>“$myHostname”
完成
如果您不想在没有临时search.txt文件的情况下执行此操作,只需替换最后一行done<请添加您正在获得的输出。很难猜测发生了什么。另外,为什么要使用backtics!?它们都是80年代的。$(…)在for循环中也可以工作;-)祝你好运。当你在
符号中使用
for i时,你会遇到在其中有空格的行(文件名中有空格)的问题除非您适当地设置了$IFS
变量。如果没有包含换行符的名称,您可以在读取换行符时使用,并从search.txt
重定向。如果您也必须处理换行符,则需要使用以null结尾的字符串(因为文件名不能包含ASCII NUL;这和斜杠是文件名组件中唯一不可能包含的字符)。