相关疑难解决方法(0)

双引号内的感叹号会导致奇怪的解析错误

为什么这个命令行有效:

$ output='Irrelevant'; if [[ $output =~ Something ]]; then echo "I found something in the output." ; fi
Run Code Online (Sandbox Code Playgroud)

这个给我一个奇怪的解析错误?

$ output='Irrelevant'; if [[ $output =~ Something ]]; then echo "I found something in the output!" ; fi
-bash: !": event not found
Run Code Online (Sandbox Code Playgroud)

从第一个版本的变化是引号内被呼应了一句带有感叹号结束.为什么Bash在第二个版本中给我错误?

如果重要,这是以下产出bash --version:

GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)
Run Code Online (Sandbox Code Playgroud)

bash quotes

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

变量中的通配符,Shell bash,怎么办?变量= $变量2*

对我来说它有效:

diretorio=$(echo 'test 123'*)
Run Code Online (Sandbox Code Playgroud)

但是当我在引号中使用变量时却没有用

Var2="test 123" 
diretorio=$(echo '$Var2'*)
Run Code Online (Sandbox Code Playgroud)

怎么解决?

variables bash shell wildcard

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

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
查看次数

Shell变量在双引号Perl单行中可见

我理解shell变量是当前shell的本地变量,而环境变量(exported 变量)传递给shell分叉的子进程.

当我在双引号内运行Perl单行程序时,我可以从forked perl进程访问(本地)shell变量:

$ FOO=bar
$ perl -we "print qx'echo $FOO'"
bar
Run Code Online (Sandbox Code Playgroud)

这是为什么?

shell perl

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

如何在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 shell 运行“git filter-branch”

我似乎无法让“git filter-branch”在 bash 中工作:

  fix_commit_date() { 
   git filter-branch --env-filter \
     'if [ $GIT_COMMIT = "${1}" ]
      then
        export GIT_AUTHOR_DATE="${2}"
        export GIT_COMMITTER_DATE="${2}"
      fi' -f
   }
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误消息:

fix_commit_date b62178fd4d40e1e52a7bfef64ff2f269c3aff7f8 "Mon Aug 12 13:03:00 2019"
Rewrite b62178fd4d40e1e52a7bfef64ff2f269c3aff7f8 (8/8) (0 seconds passed, remaining 0 predicted)    
WARNING: Ref 'refs/heads/master' is unchanged
Run Code Online (Sandbox Code Playgroud)

如果我只是输入它而不使用 fix_commit_date ,它在 bash 中工作得很好。有什么想法可以让 fix_commit_date bash 命令起作用吗?谢谢。

git bash

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

当前工作目录以别名输出

我想创建一个将打印出当前工作目录子名称的别名.

我有这个:

BASENAME=${PWD##*/}
alias wai="echo $BASENAME"
Run Code Online (Sandbox Code Playgroud)

这将输出目录.bashrc存储的目录子名称.我希望它是当前的工作目录.

对不起,如果这很简单,我是bash的新手.

bash

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

根据引用类型对 ~/.bash_profile 别名中的 pwd 进行不同评估

这是在 OSX El Capitan 上,但也发生在我的 Ubuntu 别名中。

我遇到了一个问题,我创建的别名将工作目录传递给 docker 容器。

这将不起作用(无论我在哪个目录中,始终为 $(pwd) 传递 ~/Users/username ):

alias phpqa="docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa"
Run Code Online (Sandbox Code Playgroud)

作品:

alias phpqa='docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa'
Run Code Online (Sandbox Code Playgroud)

但是,当传入错误的路径时,我的脚本中开始出现意外错误。所以我做了一个实验。我将这两个别名添加到我的 ~/.bash_profile 中。

alias getpath="echo $(pwd)"
alias getpath2='echo $(pwd)'
Run Code Online (Sandbox Code Playgroud)

我注销然后重新登录。

更改目录:

$ cd /Users/username/correct/path/to/project
Run Code Online (Sandbox Code Playgroud)

执行两个别名:

$ getpath
/Users/username

$ getpath2
/Users/username/correct/path/to/project
Run Code Online (Sandbox Code Playgroud)

带双引号的别名总是返回用户主目录,而带单引号的别名返回当前目录。有人可以解释为什么会这样吗?

macos shell alias osx-elcapitan

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

在awk中使用双引号

此命令将打印a.

echo "line1 a b c" | awk '{ print $2 }'
Run Code Online (Sandbox Code Playgroud)

如果我将单引号更改为双引号,就像这样,它将打印整行.

echo "line1 a b c" | awk "{ print $2 }"
Run Code Online (Sandbox Code Playgroud)

为什么?我知道我应该使用单引号,但如果我使用双引号,为什么打印整行?

linux shell

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

使用来自 shell 变量的 JSON 内容运行 curl 命令

我有下面的脚本...

而且我似乎无法让变量起作用

#!/bin/bash

info = 'Help...?'    
object='{"attachments": [{"title": "ti1","text": $info }]}'    
curl -X POST -H 'Content-type: application/json' --data '$object' https://hooks.slack.com/services/xxxx

exit 0
Run Code Online (Sandbox Code Playgroud)

即使--data '$object'没有$info……也无法工作,因为 Slack API 无法读取我的请求。

我该如何解决?

linux bash shell

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

标签 统计

bash ×7

shell ×6

linux ×3

alias ×1

git ×1

macos ×1

osx-elcapitan ×1

perl ×1

quotes ×1

unix ×1

variables ×1

wildcard ×1