我正在尝试通过以下命令执行命令列表:
bash -l -c "commands"
Run Code Online (Sandbox Code Playgroud)
但是,当我定义一个变量然后尝试使用它们时,该变量是未定义的(空的)。要清楚:
bash -l -c "var=MyVariable; echo $var"
Run Code Online (Sandbox Code Playgroud) 我的bash脚本有这个奇怪的问题.我编译boost作为其中的一部分.脚本调用如下所示:
./b2 --reconfigure ${PARALLEL} link=static cxxflags=-fPIC install boost.locale.iconv=off boost.locale.posix=off -sICU_PATH="${ICU_PREFIX}" -sICU_LINK="${BOOST_ICU_LIBS}" >> "${BOOST_LOG}" 2>&1
Run Code Online (Sandbox Code Playgroud)
该命令非常有效.日志文件显示它发现ICU没有问题.但是,如果我将其更改为从变量运行,它将不再找到ICU(但它仍会编译其他所有内容):
bcmd="./b2 --reconfigure ${PARALLEL} link=static cxxflags=-fPIC install boost.locale.iconv=off boost.locale.posix=off -sICU_PATH=\"${ICU_PREFIX}\" -sICU_LINK=\"${BOOST_ICU_LIBS}\""
$bcmd >> "${BOOST_LOG}" 2>&1
Run Code Online (Sandbox Code Playgroud)
有什么不同?我希望能够使用第二种方法,以便我可以在运行之前将命令传递给另一个函数.
我有这个简单的任务,我已经花了几个小时试图弄清楚如何在我的bash脚本中使用curl调用中的变量:
message="Hello there"
curl -X POST -H 'Content-type: application/json' --data '{"text": "${message}"}'
Run Code Online (Sandbox Code Playgroud)
这是输出$ {message},字面上是因为它在单引号内.如果我更改引号并将double放在外部并且单个内部,则表示找不到命令:Hello,然后找不到命令:那里.
我怎样才能做到这一点?
我的配置中有一个变量,我想用一个值替换它。
ROOT="rROOT"
Run Code Online (Sandbox Code Playgroud)
我想将其替换为
ROOT="$root"
Run Code Online (Sandbox Code Playgroud)
$root 的值也是如此(重要的是引号)。
到目前为止我已经尝试过这种方式
sed -i s/'ROOT=rROOT'/'ROOT="$root"'/g $directory/settings.conf
Run Code Online (Sandbox Code Playgroud)
结果是
ROOT="$root"
Run Code Online (Sandbox Code Playgroud)
但这存储在变量 $root 中(它始终是一个路径)
root: /
Run Code Online (Sandbox Code Playgroud)
如何用 $root 的值替换 rROOT?
Sed 版本:(GNU sed)4.2.2
我已经搜索了一段时间,但似乎找不到明确的答案...我试图从终端运行 psql 脚本,同时传递表变量名称和另一个变量作为 psql 脚本的一部分。
bash 命令:
psql db1 -U user1 -f '/.../Desktop/.../sample.sql' -v table=pg2 -v v1="'2018-02-01'";
Run Code Online (Sandbox Code Playgroud)
PSQL 脚本:
SELECT count(*) FROM :table WHERE datekey = :v1;
Run Code Online (Sandbox Code Playgroud)
以上有效。但是,我希望能够将表名和附加变量转换为脚本本身中的字符串,以便我可以在我定义的另一个函数中使用它。例如,我希望 pg2 的表名可以作为字符串“pg2”使用。与 datekey 变量类似的要求。这可能吗?我的观察是,只有在 CRUD 操作或 WHERE 子句中使用时才可以传递变量。
这是在Internet上找到的一段代码
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
putenv("PATH=/nothinghere");
//setenv("PATH","/nothinghere");
system(argv[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我做
$./a.out "ls"
sh: 1: ls: not found
Run Code Online (Sandbox Code Playgroud)
当然但是如果
$./a.out "echo $PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Run Code Online (Sandbox Code Playgroud)
它打印原始$PATH!!
如果我们创建一个新shell,那么就做同样的事情
int main(int argc, char* argv[])
{
putenv("PATH=/nothinghere");
//setenv("PATH","/nothinghere");
system("/bin/sh");
return 0;
}
$./a.out
$ echo $PATH
/nothinghere
$ ls
/bin/sh: 2: ls: not found
Run Code Online (Sandbox Code Playgroud)
为什么?是关于fork还是实施的问题echo?
我有以下脚本
#!/bin/bash
set i=0;
while read line
do
echo "$line";
$i < cat "my.log" | grep -w '$line' | wc -l;
echo "$i";
i=0;
done < "test.txt"
Run Code Online (Sandbox Code Playgroud)
test.txt 有像
abc
def
lmn
Run Code Online (Sandbox Code Playgroud)
我的日志具有类似的值
> INFO 2013-08-16 13:46:48,660 Index=abc insertTotal=11
> INFO 2013-08-16 13:46:48,660 Index=abcd insertTotal=11
> INFO 2013-08-16 13:46:48,660 Index=def insertTotal=11
> INFO 2013-08-16 13:46:48,660 Index=abcfe insertTotal=11
Run Code Online (Sandbox Code Playgroud)
目标是从 中选取每个值test.txt并在my.log文件中搜索该模式。
找到模式的次数分配给变量i。
我将检查 的值,i如果是0或找不到模式,那么我希望将该模式存储在另一个文件中。
目前,我得到
./parser.sh: line 7: cat: No such file …Run Code Online (Sandbox Code Playgroud) 我正在研究一个简单的守护进程示例,并注意到以下命令在每次迭代时都会打印相同的时间值.
/bin/bash -c "while true; do echo `date`; sleep 1; done"
Run Code Online (Sandbox Code Playgroud)
输出:
Wed Dec 25 08:00:47 UTC 2013
Wed Dec 25 08:00:47 UTC 2013
Wed Dec 25 08:00:47 UTC 2013
Run Code Online (Sandbox Code Playgroud)
但是,如果我将上面的代码放在脚本中然后运行脚本,它会给出预期的输出.
#!/bin/bash
while true; do
echo `date`
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
输出:
Wed Dec 25 08:02:58 UTC 2013
Wed Dec 25 08:02:59 UTC 2013
Wed Dec 25 08:03:00 UTC 2013
Run Code Online (Sandbox Code Playgroud)
这怎么可能?这是预期的产出吗?
我可以做以下事情:
$ FOO="text"
$ echo $FOO
$ text
Run Code Online (Sandbox Code Playgroud)
但是如何将其包装在bash -c构造中?我尝试过但失败了:
$ FOO="text"
$ bash -c 'echo $FOO'
$ # return nothing
Run Code Online (Sandbox Code Playgroud)
我问这个的原因是因为我需要执行另外需要包装的第三方代码 bash -c
我正在尝试执行以下命令:
curl -k -i -X POST -d ' { "path" : "/" }'
https://david:mypa$$@example.com:9092/files/browse
Run Code Online (Sandbox Code Playgroud)
鉴于我的密码是 ,我将如何正确发送上述命令mypa$$?