标签: quoting

svn | awk | 邮件在bash中工作,但不在cron工作中

我有以下命令来显示对subversion存储库的更改

svn log -v -r{$(date +%Y-%m-%d)}:HEAD http://therepository | awk '/^r[0-9]+ / {user=$3} {if (user=="username") {print $1 $2 $3}}' | mail -ne -s'Users SVN commits' email@email.com
Run Code Online (Sandbox Code Playgroud)

它在命令行中工作正常.

当我将其粘贴到crontab中时,我收到以下错误消息:

/bin/sh: -c: line 0: unexpected EOF while looking for matching `)'
/bin/sh: -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

如何引用它?

svn shell cron awk quoting

2
推荐指数
1
解决办法
1617
查看次数

BASH在调试模式下引用

我在BASH脚本中使用调试模式来跟踪脚本执行的命令.到目前为止,这一切都运行良好,但现在我需要运行一个命令,其中包含一些字符串中的选项,该字符串包含引号,这些引号似乎在调试模式下导致问题.

这是一个简短的例子

#!/bin/bash
job_opts='-q long -M5000000 -R"select[mem>5000] rusage[mem=5000]"'
set -x
bsub $job_opts # .... more options for job here
set +x
Run Code Online (Sandbox Code Playgroud)

此脚本使用bsub命令生成对lsf作业队列的提交,但这无关紧要.在STDERR上,我看到了这个痕迹:

+ bsub -q long -M5000000 '-R"select[mem>5000]' 'rusage[mem=5000]"' 
Job submission rejected.
Run Code Online (Sandbox Code Playgroud)

bsub命令应该是这样的:

+ bsub -q long -M5000000 -R"select[mem>5000]' 'rusage[mem=5000]"
Run Code Online (Sandbox Code Playgroud)

所以我的bsub命令失败了,我也可以看到这是因为它没有看到-R开关,大概是因为整个开关周围有额外的单引号.

我知道BASH在调试模式下在引用的字符串周围放置单引号,但我没想到这会影响正在发出的实际命令,这似乎已经发生了.

我在这里做错了什么,或者有没有办法在BASH调试模式中避免这种额外的引用?以这种方式记录命令是非常方便的,如果因为那些讨厌的引用我不能再这样做,那将是一种耻辱.

谢谢你的帮助!

debugging bash quoting

2
推荐指数
1
解决办法
537
查看次数

了解查找中的转义括号

我把下面的内容拼凑在一起,似乎有效,可能的例外是"!-empty".我正在学习的一件事(就像我去的那样)是因为某些东西起作用,并不意味着它是正确的或正确形成的...我的问题是你如何确定需要括号的内容和查找中的内容命令?

在OS X中, - 并且"由两个表达式的并置暗示它不必指定"

我的目标是找到:找到超过5分钟但不是空的目录,而不是.dot(隐藏-ie"."和"..")

count="$( find . -type d -mmin +5 \! -empty \( ! -iname ".*" \) | wc -l )"
echo $count
if [ "$count" -gt 0 ] ; then
    echo $(date +"%r") "$cust_name loc 9: "${count}" directories exist to process, moving them" >> $logFILE
    find . -type d -mmin +5 \! -empty \( ! -iname ".*" \) | xargs -I % mv % ../02_processing/

    cd $processingPATH

    # append the time and the directories to be …
Run Code Online (Sandbox Code Playgroud)

bash shell find quoting

2
推荐指数
1
解决办法
1099
查看次数

clojure引号和宏中的波浪号

我是Clojure的新手,我无法理解它的报价系统.我正在写一个宏,我做了两个相似的案例 - 一个是有效的,另一个则没有.从某种意义上说,我只是试图用try/catch条件包围我的语句.

这是有效的代码:

(defmacro safe
  [arg1 arg2]
  (list 'let arg1 arg2)
)
Run Code Online (Sandbox Code Playgroud)

这是不起作用的代码

(defmacro safe
    [arg1 arg2]
    '(try
        ~(list 'let arg1 arg2)
        (catch Exception e (str "Error: " (.getMessage e)))
    )
)
Run Code Online (Sandbox Code Playgroud)

~符号之后,它应该逃脱引号,但由于某种原因,它似乎没有.错误是:"无法解析符号:此上下文中的arg1 ......".

谢谢你的帮助!


编辑:

我用以下代码调用宏的代码:

(println (safe [s (new FileReader (new File "text.txt"))] (.read s)))
Run Code Online (Sandbox Code Playgroud)

另外,我导入这个:

(import java.io.FileReader java.io.File)
Run Code Online (Sandbox Code Playgroud)

目标是从文件中读取第一个符号,同时避免不正确的文本文件名.顺便说一句,这是我的学校作业,所以我不应该用任何其他方式来做这个,并且必须像这样调用宏,我知道with-open等等.

lisp macros clojure quoting

2
推荐指数
1
解决办法
3315
查看次数

TCL:如何使用大括号"{...}"引用一个字符串中的单个大括号"{"?

我试图使用大括号来定义字符串{ },而不是双引号的" ",所以我没有逃避几个字符(如$,[,]).

但是,当我的字符串需要在其中包含单个字符串时,我遇到了一些问题{.
我知道我可以通过简单地使用双引号字符串来实现这一点{,但是如何使用"花括号字符串"来实现它?

例如.我想要puts以下字符串' proc foo {} { '到stdout.

puts "proc foo \{ \} \{"给了我想要的输出:' proc foo {} { '

然而,puts { proc foo \{ \} \{ }给我:' proc foo\{\}\{ '通过字面打印反斜杠.

如果我跳过反斜杠,puts { proc foo { } {它会抱怨缺少支撑.

此外,如果所需的字符串中有匹配的闭括号,它可以正常工作.
puts { proc foo { } { } }给了我预期的:' proc foo {} {} '

在"花括号"字符串中逃避单个不匹配的花括号的正确方法是什么?

string tcl quoting curly-braces

2
推荐指数
1
解决办法
2746
查看次数

引用千位分隔符

awk可以使用千位分隔符来打印数字:

$ awk "BEGIN {printf \"%'d\", 1000}"
1,000
Run Code Online (Sandbox Code Playgroud)

但是,它需要单引号这一事实意味着您必须遍历每个脚本"$在整个脚本中:

$ echo 1000 2000 | awk "{printf \"%'d\", \$2}"
2,000
Run Code Online (Sandbox Code Playgroud)

这在这里很容易,但是对于大型例子来说可能很麻烦.我想做这样的事情:

$ echo 1000 2000 | awk '{printf z, $2}' z="%'d"
2,000
Run Code Online (Sandbox Code Playgroud)

但即便如此,对于高级示例来说也不是很好:

$ echo 1000 2000 | awk '{printf "hello " z " world " z, $1, $2}' z="%'d"
hello 1,000 world 2,000
Run Code Online (Sandbox Code Playgroud)

我试图搞乱OFMTCONVFMT,但他们似乎没有任何效果:

$ echo 1000 2000 | awk '{print $2}' OFMT="%'d" CONVFMT="%'d"
2000
Run Code Online (Sandbox Code Playgroud)

这些变量可以按照我尝试使用它们的方式使用,还是另一种可以更好地处理引用问题的方法?

awk printf quoting

2
推荐指数
1
解决办法
315
查看次数

如何传递带有特殊字符的参数来调用shell脚本

使用如下所需的参数调用.sh(shell脚本): -

sh home/example.sh --context_param dbUserName=username --context_param dbPassword=exam!ple##### --context_param resultDate=2017-01-13
Run Code Online (Sandbox Code Playgroud)

使用参数dbUsername和password调用example.sh但是出现以下错误: -

-bash:!ple #####:找不到事件

我认为特殊字符限制命令执行.然后我如何传递特殊字符.任何帮助都会很明显.

linux bash shell quoting

2
推荐指数
1
解决办法
7659
查看次数

如何引用命令替换以使其行为类似于"$ @"?

$*相当于$1 $2 $3...- 拆分所有空格.

"$*"相当于"$1 $2 $3..."- 这里没有分裂.

"$@"相当于"$1" "$2" "$3"...- 分裂参数(每个参数单独引用).

如何引用$(command) 以便它以相同的方式"$@"处理命令的输出行来处理参数?

我想解决的问题:

我有一个备份函数,通过参数获取文件并备份每个文件(例如:) backup file1 file_2 "file 3".我想快速备份另一个命令返回的文件.

mycmd返回三个文件(每行一个):file1,file_2file 3(包含空格).如果我运行以下命令:

backup $(mycmd)

它将等同于运行,backup file1 file_2 file 3并且由于不存在的文件3而导致错误.但是这样运行:

backup "$(mycmd)"

相当于运行:

backup "file1
file_2
file 3"

它们都不够好.

如何使用命令替换来获得相当于的调用:backup "file1" "file_2" "file 3"

目前我唯一的解决方法是:

while read line; do backup "$line"; done …

bash quoting command-substitution

2
推荐指数
1
解决办法
202
查看次数

'kubectl patch' works on Linux Bash but not in Windows Powershell ISE

The following command works fine on Ubuntu bash:

kubectl patch deployment wapi-backend-d1 --patch '{"spec": {"template": {"metadata": {"labels": {"date": "test"}}}}}'
Run Code Online (Sandbox Code Playgroud)

The same command does not work in Windows Powershell Console (ISE).

The error is:

kubectl : Error from server (BadRequest): invalid character 's' looking for beginning of object key string
At line:1 char:1
+ kubectl patch deployment wapi-backend-d1 --patch '{"spec": {"template ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (Error from serv...ject key string:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
Run Code Online (Sandbox Code Playgroud)

The powershell …

syntax powershell parameter-passing quoting kubectl

2
推荐指数
2
解决办法
423
查看次数

回显传递给带有可见引号的命令的确切命令行

因此,我可以很高兴地在bash数组中建立一个命令行,然后用引号将其执行并获得每个引号的引号:

declare -a cmd_args
cmd_args=("-p" "dir path/with spaces")
mkdir "${cmd_args[@]}"
echo dir*/*
Run Code Online (Sandbox Code Playgroud)

但是,如何以一种有意义的方式将其回显到屏幕上,即向用户显示他们可以键入的命令,或者可以将其保存在日志文件中以备将来参考?所有这些看起来(基本上)是相同的:

echo runnimg mkdir with arguments ${cmd_args[@]}
echo runnimg mkdir with arguments "${cmd_args[@]}"
echo "runnimg mkdir with arguments '${cmd_args[@]}'"
echo "runnimg mkdir with arguments '${cmd_args[*]}'"

==> runnimg mkdir with arguments '-p dir path/with spaces'
Run Code Online (Sandbox Code Playgroud)

这显然是错误的命令。这并没有向用户显示他们可以键入的命令,或者我可以保留在日志文件中并在将来的日期重现的命令。我想看看:

runnimg mkdir with arguments '"-p" "dir path/with spaces"'
Run Code Online (Sandbox Code Playgroud)

我考虑过使用cat<<EOF

cat<<EOF 
"${cmd_args[@]}" 
EOF
Run Code Online (Sandbox Code Playgroud)

但实际上,这会在整个参数列表中产生一个很大的报价!这里有什么?这怎么可能永远是我的意图是什么?如果是这样,那我就有"${cmd_args[*]}"

这就是挑战。以用户可以说“是的,这是正确的命令”的方式打印命令。

对那些说“%p \ n”的人表示抱歉,但是对于日志文件来说这可能没问题,但是返回并对其进行“毫不含糊地”格式化以重新测试该命令仍然很麻烦,但它确实不够好交互式“这是命令反馈给用户”。

也许已经有一个答案,但是如果是这样,那么所有“总是引用您的论据”类型的答案就会淹没它。

bash quoting

2
推荐指数
1
解决办法
78
查看次数