相关疑难解决方法(0)

根据引用类型对 ~/.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
查看次数

使用 $USER 时回显“root”

我想更好地了解 bash 以及何时评估变量。

使用时sudo可以检出使用的用户环境env与root环境交换。因此envsudo env产生不同的结果。

现在,如果我正在执行sudo echo "I am $USER"!结果是I am my-username! 而不是I am root!,大概是因为在执行 sudo 命令之前查找了 $USER 变量。

如何使用相同的命令I am root!来打印?我是否需要一些开关或以某种方式更改字符串?

bash sudo

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

在Bash脚本中使用大括号内的int变量

我有一个脚本,显示目录中包含5个或更少字符的文件名:

#!/bin/bash

ls | egrep '^.{0,5}$'
Run Code Online (Sandbox Code Playgroud)

示例目录:

foobar
foo
bar
Run Code Online (Sandbox Code Playgroud)

输出:

foo
bar
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用变量代替5时,如下所示,我得不到输出.没有错误,所以我假设它仍在寻找某种范围.但不是0-5.

#!/bin/bash

declare -i num=5
ls | egrep '^.{0,$num}$'
Run Code Online (Sandbox Code Playgroud)

如何在花括号内使用变量?

linux bash

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

curl:JSON 中的意外令牌

当我尝试提交此内容时,服务器将消息发回给我

"Unexpected token t in JSON at position 1".

无论第一个非 { 非 " 字符是什么,它都会这样做。如果我输入 {"": ""} 它会说

"Unexpected token : in JSON at position 1".
Run Code Online (Sandbox Code Playgroud)

这是我的代码。

  curl -H "Content-Type: application/json" -d {"test": "test"} url
Run Code Online (Sandbox Code Playgroud)

我已经尝试了在它周围加上引号并转义引号的其他变体,但无济于事,但如果您认为这是问题,请随时提出一种格式。

bash json curl

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

如何在 bash 脚本中使用命令行参数进行查找?

我很难使用 find 命令编写简单的脚本。我想删除某个目录中给定大小的文件。我希望能够指定文件名称(如 Efficiency_*)和要删除的文件大小。我尝试了以下脚本:

#!/bin/bash
CD=($pwd)
find $CD -name $1 -size $2 -delete
Run Code Online (Sandbox Code Playgroud)

我从正确的目录运行它,如下所示:

/path/to/directory/script.sh 'Efficiency_*' '-500c'
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

正确的做法是什么?

bash find

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

Bash单引号未知行为

我在这里已经阅读了Bash中单引号和双引号之间的区别,即单引号将不允许任何插值。但是我遇到了这样一种情况,单引号实际上是插值变量值的唯一方法。为了示例,我创建了一个名为“ test_file”的文件,其中包含

1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

我在同一目录中创建了一个脚本,该脚本的目的是提取该文件的各个部分,我将其称为test.sh,其内容如下:

#!/bin/bash
BEGIN=3
END=9

cat test_file | sed -n ''$BEGIN', '$END'p'
Run Code Online (Sandbox Code Playgroud)

现在,我尝试了最后一行的不同设置,例如:

cat test_file | sed -n '${BEGIN}, ${END}p'
cat test_file | sed -n '"${BEGIN}", "${END}"p'
cat test_file | sed -n '"$BEGIN", "$END"p'
Run Code Online (Sandbox Code Playgroud)

但是他们都不起作用。我的问题是:为什么这样工作?

bash sed

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

bash 使用 -v 测试注入漏洞

我的 bash 脚本之一包含此测试:

if [ ! -v "$3" ]; then
   exit
else
   ...
fi
Run Code Online (Sandbox Code Playgroud)

有没有办法在 $3 参数中注入数据来执行一些令人讨厌的事情?(我的脚本以 suid 权限运行并包含敏感变量...)

谢谢

bash

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

将变量和字符串组合在一起的 grep

我希望能够使用 grep 结合变量和字符串进行搜索。

test="HTTP/[0-9].[0-9]" 
grep '$test [0-9][0-9][0-9] ||' some_file
Run Code Online (Sandbox Code Playgroud)

试图将变量放在 ${test} 中,但这没有帮助。

如何将 grep 参数与变量和字符串结合使用?

regex variables bash grep

0
推荐指数
1
解决办法
2222
查看次数

编辑以使用 sed 打印新行两次

我在 SSH 配置中有这个设置( /etc/ssh/sshd_config)

AllowUsers root john
Run Code Online (Sandbox Code Playgroud)

我想添加jane到行尾

AllowUsers root john jane 
Run Code Online (Sandbox Code Playgroud)

我试过了

sed -i -e '/AllowUsers/{s/:/ /g;s/.*=//;s/$/ jane/p}' /etc/ssh/sshd_config && cat /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

我一直得到这个结果

AllowUsers root john jane 
AllowUsers root john jane 
Run Code Online (Sandbox Code Playgroud)

为什么会有多余的线?


笔记

如果我以某种方式运行该命令两次

我会得到这些结果

AllowUsers root john jane 
AllowUsers root john jane 
AllowUsers root john jane 
AllowUsers root john jane 
Run Code Online (Sandbox Code Playgroud)

再次运行 x3 次,将得到这个

AllowUsers root john jane 
AllowUsers root john jane 
AllowUsers root john jane 
AllowUsers root john jane 
AllowUsers root john jane …
Run Code Online (Sandbox Code Playgroud)

unix sed

0
推荐指数
1
解决办法
61
查看次数

Shell:将变量插入命令中

我试图找到一种方法,在此命令中使用变量将 -10 替换为 n_days var:

   n_days= -10
   date_prefix=$(date -d '-10 day' +%Y/%m/%d)
Run Code Online (Sandbox Code Playgroud)

我尝试了这种方法,但没有成功:

   date_prefix=$(date -d '${n_days} day' +%Y/%m/%d)
Run Code Online (Sandbox Code Playgroud)

unix linux bash shell date

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

字符串变量插值

我编写了这个脚本:

for i in `seq 1 $1`; do
        timestamp=$(uuidgen)
        cat $2.json | jq '.transactionId = "$timestamp"' > $3/$timestamp.json
done
Run Code Online (Sandbox Code Playgroud)

我的问题是,jq '.transactionId = "$timestamp"'因为文件的内容是:

{
  "transactionId": "$timestamp"
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

bash sh jq

-1
推荐指数
1
解决办法
98
查看次数

bash/shell jq从aws json解析为变量

我试图从aws结果解析json结果,但是当我使用$ ip时,我得到错误或null,当我使用特定的IP时它工作.当我在jq命令中使用tne变量时出错了

#!/bin/bash

aws ec2 describe-addresses --region eu-west-1 > 1.txt
ipList=( "52.16.121.238" "52.17.250.188" )

for ip in "${ipList[@]}";
do
    echo $ip
    cat 1.txt | jq '.Addresses | .[] | select (.PublicIp==$ip) |    .InstanceId'
    #echo $result
done
Run Code Online (Sandbox Code Playgroud)

请指教.

bash shell json amazon-web-services jq

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

标签 统计

bash ×10

shell ×4

linux ×3

jq ×2

json ×2

sed ×2

unix ×2

alias ×1

amazon-web-services ×1

curl ×1

date ×1

find ×1

grep ×1

macos ×1

osx-elcapitan ×1

regex ×1

sh ×1

sudo ×1

variables ×1