读取bash脚本中的输入,该脚本是路径中带有空格的目录[重复]

Posted

技术标签:

【中文标题】读取bash脚本中的输入,该脚本是路径中带有空格的目录[重复]【英文标题】:read input in bash scrip that is a directory with spaces in the path [duplicate] 【发布时间】:2021-05-09 09:53:06 【问题描述】:

我找不到在read 中添加包含空格的条目的方法?我想将目录放入“输入要清理的目录:”read。我认为它将空格作为单独的变量读取。输入类似于/home/user/apple sauce “清理”只是从文件名中删除特殊字符。

#!/bin/bash
read -p "Enter directory to be cleaned: " directory
echo "Current Directory Structure"
/usr/bin/ls -la $directory 

read input
    if [ "$input" == "y" ]
    then
    echo "Cleaning files..." 
        for file in $directory; do mv $file $(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g'); done &
else    
    stop
fi

我面临的另一个问题是清理在创建新文件名时重复整个目录。如果我在目录本身中运行 for file in *; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g'); done & 命令,它只会创建新的文件名。如果我指定目录,它会写出整个目录:

++ sed -e 's/[^A-Za-z0-9._-]/_/g'
++ echo '/home/apples/scratch/test1/test:something?'
+ mv '/home/apples/scratch/test1/test:something?' _home_apples_scratch_test1_test_something_

我希望它只是更改文件名但有问题。任何帮助都非常感谢。

【问题讨论】:

你大多需要双引号变量; shellcheck.net 会指出在哪里。此外,for file in $directory 不会列出目录中的文件,请使用for file in "$directory"/*sed 模式尝试替换文件名 包含目录名称(这更复杂)中的字符也会遇到问题。哦,使用IFS= read -r -p ... 来避免破坏反斜杠以及开头/结尾处的空格。 @saleetzo :不要在一个问题中问两个问题。为此使用两个问题。 谢谢@GordonDavisson!我也不知道 spellcheck.net,很酷。 【参考方案1】:

我认为它将空格作为单独的变量读取

事实并非如此,您可以通过以下方式轻松验证:

read -p 'Enter string:'  x
echo "Entered: >>>$x<<<"

如果您不喜欢引用变量(以避免分词),您可以考虑从 bash 切换到 Zsh。如果你必须在 bash 中写 "$x",你只需在 Zsh 中写 $x

因此,你必须写

for file in "$directory"

但这只会循环一次迭代,file 绑定到变量directory 的内容。要遍历此目录中的条目,您将执行

for dirent in "$directory"/*

【讨论】:

以上是关于读取bash脚本中的输入,该脚本是路径中带有空格的目录[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从用户获取输入到包含空格的路径(bash脚本)[重复]

如何检查批处理脚本中带有空格的路径中文件的大小

./(点斜杠)与. (点空格)运行脚本文件的差别

While 循环在 Bash 的第一行之后停止读取

bash 脚本中带有 PKCS#12 证书的 cURL

Bash脚本添加由空格分隔的数字的绝对值