我尝试执行以下命令:
mysql AMORE -u username -ppassword -h localhost -e "SELECT host FROM amoreconfig"
Run Code Online (Sandbox Code Playgroud)
我把它存储在一个字符串中:
cmd="mysql AMORE -u username -ppassword -h localhost -e\"SELECT host FROM amoreconfig\""
Run Code Online (Sandbox Code Playgroud)
测试一下:
echo $cmd
mysql AMORE -u username -ppassword -h localhost -e"SELECT host FROM amoreconfig"
Run Code Online (Sandbox Code Playgroud)
尝试执行:
$cmd
Run Code Online (Sandbox Code Playgroud)
我得到了mysql的帮助页面:
mysql Ver 14.14 Distrib 5.1.31, for pc-linux-gnu (i686) using readline 5.1
Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute …Run Code Online (Sandbox Code Playgroud) 我想存储一个命令,以便稍后在变量中使用(不是命令的输出,而是命令本身)
我有一个简单的脚本如下:
command="ls";
echo "Command: $command"; #Output is: Command: ls
b=`$command`;
echo $b; #Output is: public_html REV test... (command worked successfully)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试更复杂的东西时,它会失败.例如,如果我做
command="ls | grep -c '^'";
Run Code Online (Sandbox Code Playgroud)
输出是:
Command: ls | grep -c '^'
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access '^': No such file or directory
Run Code Online (Sandbox Code Playgroud)
知道如何在变量中存储这样的命令(使用管道/多个命令)供以后使用吗?
我目前在从shell变量执行命令时遇到问题.
通常,以下工作符合预期:
COMMAND="echo A"
echo $COMMAND
$COMMAND
Run Code Online (Sandbox Code Playgroud)
生产:
echo A
A
Run Code Online (Sandbox Code Playgroud)
但如果我这样做
COMMAND="su aUser -s /bin/bash -c 'echo A'"
echo $COMMAND
$COMMAND
Run Code Online (Sandbox Code Playgroud)
我明白了
su aUser -s /bin/bash -c 'echo A'
Password:
A': -c: line 0: unexpected EOF while looking for matching `''
A': -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)
如果我进入该行
su aUser -s /bin/bash -c 'echo A'
Run Code Online (Sandbox Code Playgroud)
直接按预期工作.
似乎我的假设是$ COMMAND等于输入内容,因为命令直接是错误的.
1)有谁知道如何从变量运行命令?
2)究竟有什么区别
COMMAND="command"
$COMMAND
Run Code Online (Sandbox Code Playgroud)
和
command
Run Code Online (Sandbox Code Playgroud)
?
我经常运行一个简单的bash命令:
rpm -Uvh --define "_transaction_color 3" myPackage.rpm
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.
但现在我正在尝试将其编写为bash文件,并使其更灵活:
#!/bin/bash
INSTALL_CMD=rpm
INSTALL_OPT="-Uvh --define '_transaction_color 3'"
${INSTALL_CMD} ${INSTALL_OPT} myPackage.rpm
Run Code Online (Sandbox Code Playgroud)
但是,这会产生错误:
error: Macro % has illegal name (%define)
Run Code Online (Sandbox Code Playgroud)
错误来自如何处理--define和引用_transaction_color.
我尝试过各种各样的逃避,不同的措辞,甚至制作INSTALL_OPT一个数组,处理${INSTALL_OPT[@]}.
到目前为止,我的尝试没有奏效.
显然,我想要的是非常简单.我只是不确定如何实现它.
我怎样才能让bash --define正确处理我的论点?
我尝试在变量中构建一组参数并将其传递给脚本,但行为与我的预期不同.
test.sh
#!/bin/bash
for var in "$@"; do
echo "$var"
done
Run Code Online (Sandbox Code Playgroud)
输入
usr@host$ ARGS="-a \"arg one\" -b \"arg two\""
usr@host$ ./test.sh $ARGS
Run Code Online (Sandbox Code Playgroud)
产量
-a
"arg
one"
-b
"arg
two"
Run Code Online (Sandbox Code Playgroud)
预期
-a
arg one
-b
arg two
Run Code Online (Sandbox Code Playgroud)
请注意,如果将引用的参数直接传递给它运行的脚本.我也可以用eval解决这个问题,但我想了解为什么第一种方法失败了.
解决方法
ARGS="./test.sh -a "arg one" -b "arg two""
eval $ARGS
Run Code Online (Sandbox Code Playgroud) 我最近在 bash 脚本中发现了一个意外行为,我想在解决它之前先了解它。这是一个简化的示例:
#! /bin/sh
SCRIPT="/tmp/echoscript.sh >> /tmp/log"
/bin/sh ${SCRIPT}
Run Code Online (Sandbox Code Playgroud)
echoscript.sh 只是做 'echo "abc"'
出乎意料的是,'abc' 进入终端而不是 /tmp/log 文件。这是为什么?
如果我将第三行更改为:
/bin/sh ${SCRIPT} >> /tmp/log
Run Code Online (Sandbox Code Playgroud)
然后我得到了预期的结果;'abc' 转到日志文件。
通过例子解释问题......
证明 - 变量扩展后,--chapters之后的单引号会被转义(我没想到):
prompt@ubuntu:/my/scripts$ cat test1.sh
#!/bin/bash
actions="--tags all:"
actions+=" --chapters ''"
mkvpropedit "$1" $actions
prompt@ubuntu:/my/scripts$ ./test1.sh some.mkv
Error: Could not open '''' for reading.
Run Code Online (Sandbox Code Playgroud)
现在由于某种原因,mkvpropedit接收双引号作为文件名的一部分(我也没想到):
prompt@ubuntu:/my/scripts$ cat test1x.sh
#!/bin/bash
command="mkvpropedit \"$1\""
command+=" --tags all:"
command+=" --chapters ''"
echo "$command"
$command
prompt@ubuntu:/my/scripts$ ./test1x.sh some.mkv
mkvpropedit "some.mkv" --tags all: --chapters ''
Error: Could not open '''' for reading.
Run Code Online (Sandbox Code Playgroud)
上面的echo'd命令似乎是正确的.将相同的文本放在另一个脚本中会得到预期的结果:
prompt@ubuntu:/my/scripts$ cat test2.sh
#!/bin/bash
mkvpropedit "$1" --tags all: --chapters ''
prompt@ubuntu:/my/scripts$ ./test2.sh some.mkv
The file is being analyzed.
The changes are …Run Code Online (Sandbox Code Playgroud) 如何将包含空格的变量传递给脚本以便脚本正确处理它们?
我的最小例子:
测试文件
#!/bin/bash
COUNTER=1
for i in "$@"; do echo "$COUNTER '$i'"; ((COUNTER++)); done
Run Code Online (Sandbox Code Playgroud)
如果我直接使用一些参数(转义空间)调用脚本,它会起作用:
./test.sh 1 2 3\ 4 5
Run Code Online (Sandbox Code Playgroud)
输出(如预期):
1 '1'
2 '2'
3 '3 4'
4 '5'
Run Code Online (Sandbox Code Playgroud)
如果我将参数存储到变量中,反斜杠将不再被正确解释为转义字符。
TEST_ARGS="1 2 3\ 4 5"
./test.sh $TEST_ARGS
Run Code Online (Sandbox Code Playgroud)
输出:
1 '1'
2 '2'
3 '3\'
4 '4'
5 '5'
Run Code Online (Sandbox Code Playgroud)
我想得到像以前一样的输出。我怎样才能达到它?
TEST_ARGS="1 2 3\ 4 5"
# how to call ./test.sh here?
Run Code Online (Sandbox Code Playgroud)
我更详细的用例是,我有一些脚本,它为我的其他工具/脚本准备所有标志。
prepare_flags.sh(非常简约):
#!/bin/bash
echo 'TEST_ARGS="1 2 3\ 4 5"'
Run Code Online (Sandbox Code Playgroud)
在我的实际脚本中,我获取了prepare_flags.sh脚本的输出以访问TEST_ARGS:
source <( ./prepare_flags.sh )
./test.sh $TEST_ARGS # …Run Code Online (Sandbox Code Playgroud) 我正在尝试执行使用预定义变量作为标头的 curl 命令。
header='-H "Content-Type: application/json" -H "userGUID: 7feb6e62-35da-4def-88e9-376e788ffd97" -H "Content-Length: 51"'
Run Code Online (Sandbox Code Playgroud)
这本质上是 curl 命令
curl $header -w "http code: %{http_code}\\n" -X POST -d $BODY $URL
Run Code Online (Sandbox Code Playgroud)
然后返回错误消息
rl: (6) Could not resolve host: application
curl: (6) Could not resolve host: 7feb6e62-35da-4def-88e9-376e788ffd97"
curl: (6) Could not resolve host: 51"
Run Code Online (Sandbox Code Playgroud)
这按预期工作
curl -H "Content-Type: application/json" -H "userGUID: 7feb6e62-35da-4def-88e9-376e788ffd97" -H "Content-Length: 51" -w "http code: %{http_code}\\n" -X POST -d $BODY $URL
Run Code Online (Sandbox Code Playgroud)
我试图将标头作为变量传递的原因是因为我正在编写一个循环遍历数组的脚本,但目前由于某种原因这不适用于标头。为 body 传递参数没有问题。
这应该很容易,但由于某种原因,它不是:
尝试运行一个简单的curl命令,获取它的输出,然后用它做一些事情.
cmd='curl -v -H "A: B" http://stackoverflow.com'
result=`$cmd | grep "A:"`
...
Run Code Online (Sandbox Code Playgroud)
问题 - 标题"A:B"未发送.
执行curl命令似乎忽略了header参数,并运行curl两次 - 第二次以"B"作为主机(显然失败).
任何的想法?