相关疑难解决方法(0)

在 Bash 的单行命令中定义变量

我正在尝试通过以下命令执行命令列表:

bash -l -c "commands"
Run Code Online (Sandbox Code Playgroud)

但是,当我定义一个变量然后尝试使用它们时,该变量是未定义的(空的)。要清楚:

bash -l -c "var=MyVariable; echo $var"
Run Code Online (Sandbox Code Playgroud)

bash

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

b2命令在直接调用时查找ICU,但不从间接bash脚本变量中查找

我的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 boost compilation

5
推荐指数
1
解决办法
103
查看次数

如何在bash脚本中的curl调用中使用变量

我有这个简单的任务,我已经花了几个小时试图弄清楚如何在我的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,然后找不到命令:那里.

我怎样才能做到这一点?

bash shell curl

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

sed 用变量替换值

我的配置中有一个变量,我想用一个值替换它。

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

bash shell sed

4
推荐指数
1
解决办法
9351
查看次数

将变量传递给 psql 脚本

我已经搜索了一段时间,但似乎找不到明确的答案...我试图从终端运行 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 子句中使用时才可以传递变量。

postgresql variables bash psql

4
推荐指数
1
解决办法
1万
查看次数

system()中的echo $ PATH给出了错误的输出

这是在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

c linux shell

4
推荐指数
1
解决办法
90
查看次数

Unix Cat:没有这样的文件或目录错误

我有以下脚本

#!/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)

unix shell

3
推荐指数
1
解决办法
4万
查看次数

Bash循环意外地表现

我正在研究一个简单的守护进程示例,并注意到以下命令在每次迭代时都会打印相同的时间值.

/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)

这怎么可能?这是预期的产出吗?

bash shell

3
推荐指数
1
解决办法
84
查看次数

如何在bash -c命令中插入变量

我可以做以下事情:

$ 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

unix linux bash

3
推荐指数
1
解决办法
386
查看次数

如何在 bash 命令中转义 $

我正在尝试执行以下命令:

 curl -k -i -X POST -d ' { "path" : "/" }' 
    https://david:mypa$$@example.com:9092/files/browse
Run Code Online (Sandbox Code Playgroud)

鉴于我的密码是 ,我将如何正确发送上述命令mypa$$

bash shell

3
推荐指数
1
解决办法
6009
查看次数

标签 统计

bash ×8

shell ×6

linux ×2

unix ×2

boost ×1

c ×1

compilation ×1

curl ×1

postgresql ×1

psql ×1

sed ×1

variables ×1