Bash将反勾选前置到字符串

Bash将反勾选前置到字符串,bash,Bash,Bash在myStats行中不断添加一个`右前$corrected'。我怎样才能摆脱它 一点背景:我创建了一个脚本来循环search.txt中提供的文件,以提供统计信息,并将它们输出到一个新文件中。它工作得很好,但它在目录或文件中有空格的任何文件名上都会中断,因此我需要在文件路径中添加引号 出于某种原因,向文件路径添加引号会在路径的开头创建一个`符号,从而使整个脚本变得无用。substring$corrected没有帮助,myStats行中添加了` for i in $(cat search.t

Bash在myStats行中不断添加一个`右前$corrected'。我怎样才能摆脱它

一点背景:我创建了一个脚本来循环search.txt中提供的文件,以提供统计信息,并将它们输出到一个新文件中。它工作得很好,但它在目录或文件中有空格的任何文件名上都会中断,因此我需要在文件路径中添加引号

出于某种原因,向文件路径添加引号会在路径的开头创建一个`符号,从而使整个脚本变得无用。substring$corrected没有帮助,myStats行中添加了`

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;这和斜杠是文件名组件中唯一不可能包含的字符)。