读取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脚本中的输入,该脚本是路径中带有空格的目录[重复]的主要内容,如果未能解决你的问题,请参考以下文章