【问题标题】:How to get this bash script to work if the variable "fileName" contains space?如果变量“fileName”包含空格,如何让这个 bash 脚本工作?
【发布时间】:2010-01-15 16:28:17
【问题描述】:
#!/bin/bash -x

echo "Enter file name: "
read fileName
fileName=`pwd`"/$fileName"
if [ -f $fileName ]; then
    echo "file is present"
fi

即使我通过在开头和结尾添加引号来更改文件名的值.. 脚本仍然不起作用。

【问题讨论】:

  • 使用:fileName=$(pwd)/"$fileName"甚至fileName="$PWD/$fileName";那么您只需要担心用户输入 /dev/null 而不是相对于当前目录的名称(也可能是用户输入 ../../../../../../etc /密码)。最后一点:middleCapitals 在 shell 脚本中看起来很奇怪。
  • ya.. 最好使用环境变量。 :)

标签: linux bash scripting


【解决方案1】:

您也必须在if 中使用引号:

if [ -f "$fileName" ]; then

【讨论】:

    【解决方案2】:

    用双引号括起来对我有用:

    #!/bin/bash -x
    
    echo "Enter file name: "
    read fileName
    fileName=`pwd`"/$fileName"
    if [ -f "$fileName" ]; then
            echo "file is present"
    fi
    

    我相信这会处理大多数特殊字符,包括引号本身。

    【讨论】:

      【解决方案3】:

      if [ -f $fileName ]; then 更改为if -f "$fileName" ];。否则,当文件包含空格时,-f 操作将传递多个参数。如果你传入一个名为“this file”的文件,shell 会将其展开为:

      if [ -f this file ]; then
      

      导致错误。

      【讨论】:

        【解决方案4】:

        您可以在执行 -f 测试时引用文件名。试试这个

        #!/bin/bash -x
        echo "Enter file name: "
        read fileName
        fileName=`pwd`/$fileName
        if [ -f "$fileName" ]; then
            echo "file is present"
        fi
        

        【讨论】:

          【解决方案5】:

          即使用户输入了绝对路径,您也要在密码前添加。试试这个:

          case "$fileName" in
              /*) ;; # okay
              *)  fileName=`pwd`/"$fileName"
          esac
          

          这只会在文件名不以 / 开头时添加密码。

          此外,您的 if 测试只有在 fileName 是常规文件时才会成功。如果您希望它成功用于目录等,请使用 -e 而不是 -f 进行测试。

          【讨论】:

            【解决方案6】:

            用引号括起来的文件名:

            if [ -f "$fileName" ]; then
            

            【讨论】:

              猜你喜欢
              • 2017-11-30
              • 2011-10-14
              • 1970-01-01
              • 1970-01-01
              • 2021-07-29
              • 2023-01-27
              • 1970-01-01
              • 2020-05-05
              相关资源
              最近更新 更多