这与宣传的一样:
# example 1
#!/bin/bash
grep -ir 'hello world' .
Run Code Online (Sandbox Code Playgroud)
这不是:
# example 2
#!/bin/bash
argumentString="-ir 'hello world'"
grep $argumentString .
Run Code Online (Sandbox Code Playgroud)
尽管'hello world'
在第二个例子中被引号括起来,但grep解释'hello
为一个参数和world'
另一个参数,这意味着,在这种情况下,'hello
将是搜索模式world'
并将成为搜索路径.
同样,这仅在从argumentString
变量扩展参数时发生.grep 'hello world'
在第一个示例中正确解释为单个参数.
谁能解释为什么会这样?有没有一种正确的方法来扩展一个字符串变量,它将保留每个字符的语法,以便shell命令正确解释它?
希望有人能帮忙解决这个问题:
我试图用这个命令删除/ tmp上的会话文件:
find /tmp -name 'sess_*' -user Username -maxdepth 1 $CMD {} \;
Run Code Online (Sandbox Code Playgroud)
但是我遇到了这些错误:
find:warning:在非选项参数-name之后指定了-maxdepth选项,但选项不是位置的(-maxdepth影响在它之前指定的测试以及之后指定的测试).请在其他参数之前指定选项.
Run Code Online (Sandbox Code Playgroud)find: paths must precede expression Usage: find [-H] [-L] [-P] [path...] [expression]
我在网上寻找解决方案但找不到任何解决方案.我已经删除了其他命令的其他tmp文件,并想知道是否影响了一些卷或套接字.
先感谢您
我有一个包含文件名的fodler,其中包含空格.
我创建了一个替换空格的脚本,并使用_而不是""(空格)创建新文件名,并在for循环中运行mv命令.
这在脚本中没有用,并给我以下消息.
Usage: mv [-I] [ -d | -e] [-i | -f] [-E{force|ignore|warn}] [--] src target
or: mv [-I] [-d | -e] [-i | -f] [-E{force|ignore|warn}] [--] src1 ... srcN directory
Run Code Online (Sandbox Code Playgroud)
但是如果我调试shell脚本并单独提取mv命令并运行它,它确实可以正常工作而没有任何问题.
生成的命令看起来像
mv "abc ddd eee.txt" abc_ddd_eee.txt
Run Code Online (Sandbox Code Playgroud)
你能否告诉我为什么在unix盒子上输入的命令工作正常而不是通过脚本?
整个脚本:
for i in *
do
v1=$(echo $i|sed -e 's/^/"/g' -e 's/$/"/g' )
v2=$(echo $v1|sed 's/ /_/g'|
awk -F "[-.]" '{print $2,"_",$1,".",$3}'|
sed 's/ //g'|
sed -e 's/^_//g' -e 's/"$//g'|
sed 's/"//2' )
mv $v1 $v2
done
Run Code Online (Sandbox Code Playgroud)