【问题标题】:how to not escape space and backslashes in echo and while in bash?如何在回声和 bash 中不转义空格和反斜杠?
【发布时间】:2020-03-21 05:54:25
【问题描述】:

我将两个位置参数传递给要运行的脚本,两个参数都是路径,在分析路径的场景中,问题是有时会有一些路径,例如:m i sc . . . . .. . . 它有点和空格,有时甚至我们在目录名中有一个反斜杠。

尝试通过两个过程直接和通过at sign 获取参数。

SOURCE_ARG=$1
DESTINATION_ARG=$2

ARG_COUNT=0
for POSITIONAL_ARGUMENTS in "${@}"
do
    ((ARG_COUNT++))
    ARGUMENT_ARRAY[$ARG_COUNT]=$POSITIONAL_ARGUMENTS
done

在循环中,我遍历转发给它们的命令的结果。

while IFS= read -r dir
do
    echo "${ARGUMENT_ARRAY[1]}"
    echo "${dir}"
    while IFS= read -r item
    do

       # do some stuff

    done < <(ls -A "$dir"/)
done < <(du -hP "$SOURCE_ARG" | awk '{$1=""; print $0}' | grep -v "^.$" | sed "s/^ //g")

当我使用echo "${ARGUMENT_ARRAY[1]}" 时,我得到的路径与我需要检查的路径相同,但是当在这里使用循环迭代变量作为 dir 时 ->echo "${dir}" 我得到了所有空格,因为该路径的其他命令无法执行他们的工作。

我要问的是如何在循环中获得$dir 的输出,就像我上面提到的echo "${ARGUMENT_ARRAY[1]}" 一样(所有空格和反斜杠的输入)

【问题讨论】:

  • 对于初学者,您可以用ARGUMENT_ARRAY=("$@") 替换整个for 循环,如果甚至需要该数组来代替"$@" 本身。第二,don't parse ls。除此之外,不清楚你在问什么。
  • 不要使用全大写的变量名。这些通常保留给环境变量。
  • 我在这里看不到任何会自动转义字符串的东西。 echo 不这样做。当ls--escape 选项一起使用时,ls 将转义名称,或者它正在写入终端,但它在此处写入管道。
  • 如果文件名在一行中有多个空格,您使用awk 会将它们折叠成一个空格。
  • 如果您对用法列不感兴趣,为什么要使用du?如果您只需要目录列表,请使用 find "$SOURCE_ARG" -type d

标签: linux bash shell command-line-arguments


【解决方案1】:

感谢 cmets 中的@Barmar。

文件名没有转义的唯一原因(即您看到没有特殊字符或特殊字符已转义的目录)是因为du 正在打印带有转义的文件名,因此$dir 变量将转义一次并且特殊在我的问题中,字符不再可用于其他循环迭代。

现在我们知道问题是通过在我的脚本中使用 du 引起的:

while IFS= read -r dir

        # do sth

done < <(du -hP "$SOURCE_ARG" | awk '{$1=""; print $0}' | grep -v "^.$" | sed "s/^ //g")

我们可以把du改成find,问题就解决了:

while IFS= read -r dir

        # do sth

done < <(find "$SOURCE_ARG" -type d –)

PS 1:

另一个问题是我想打印这些行来检查它们是否正常(即在调试应用程序时)是echo

因此请务必尝试使用printf "%s\n" "$dir" 而不是echo,因为echo 的某些版本会处理转义序列。

    echo "${dir}"

    printf "%s\n" "$dir"

PS 2:

另外,如果文件名有more than one space in a row,我使用awk 的方式是将它们折叠成一个空格。

awk '{$1=""; print $0}' | grep -v "^.$" | sed "s/^ //g"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2016-06-15
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多