我有以下命令来显示对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)
如何引用它?
我在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调试模式中避免这种额外的引用?以这种方式记录命令是非常方便的,如果因为那些讨厌的引用我不能再这样做,那将是一种耻辱.
谢谢你的帮助!
我把下面的内容拼凑在一起,似乎有效,可能的例外是"!-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) 我是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等等.
我试图使用大括号来定义字符串{ },而不是双引号的" ",所以我没有逃避几个字符(如$,[,]).
但是,当我的字符串需要在其中包含单个字符串时,我遇到了一些问题{.
我知道我可以通过简单地使用双引号字符串来实现这一点{,但是如何使用"花括号字符串"来实现它?
例如.我想要puts以下字符串' proc foo {} { '到stdout.
puts "proc foo \{ \} \{"给了我想要的输出:' proc foo {} { '
然而,puts { proc foo \{ \} \{ }给我:' proc foo\{\}\{ '通过字面打印反斜杠.
如果我跳过反斜杠,puts { proc foo { } {它会抱怨缺少支撑.
此外,如果所需的字符串中有匹配的闭括号,它可以正常工作.
puts { proc foo { } { } }给了我预期的:' proc foo {} {} '
在"花括号"字符串中逃避单个不匹配的花括号的正确方法是什么?
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)
我试图搞乱OFMT和CONVFMT,但他们似乎没有任何效果:
$ echo 1000 2000 | awk '{print $2}' OFMT="%'d" CONVFMT="%'d"
2000
Run Code Online (Sandbox Code Playgroud)
这些变量可以按照我尝试使用它们的方式使用,还是另一种可以更好地处理引用问题的方法?
使用如下所需的参数调用.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 #####:找不到事件
我认为特殊字符限制命令执行.然后我如何传递特殊字符.任何帮助都会很明显.
$*相当于$1 $2 $3...- 拆分所有空格.
"$*"相当于"$1 $2 $3..."- 这里没有分裂.
"$@"相当于"$1" "$2" "$3"...- 分裂参数(每个参数单独引用).
如何引用$(command) 以便它以相同的方式"$@"处理命令的输出行来处理参数?
我想解决的问题:
我有一个备份函数,通过参数获取文件并备份每个文件(例如:) backup file1 file_2 "file 3".我想快速备份另一个命令返回的文件.
mycmd返回三个文件(每行一个):file1,file_2和file 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 …
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 …
因此,我可以很高兴地在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”的人表示抱歉,但是对于日志文件来说这可能没问题,但是返回并对其进行“毫不含糊地”格式化以重新测试该命令仍然很麻烦,但它确实不够好交互式“这是命令反馈给用户”。
也许已经有一个答案,但是如果是这样,那么所有“总是引用您的论据”类型的答案就会淹没它。