这是在 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)
带双引号的别名总是返回用户主目录,而带单引号的别名返回当前目录。有人可以解释为什么会这样吗?
此命令将打印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)
为什么?我知道我应该使用单引号,但如果我使用双引号,为什么打印整行?
我想更好地了解 bash 以及何时评估变量。
使用时sudo可以检出使用的用户环境env与root环境交换。因此env,sudo env产生不同的结果。
现在,如果我正在执行sudo echo "I am $USER"!结果是I am my-username!
而不是I am root!,大概是因为在执行 sudo 命令之前查找了 $USER 变量。
如何使用相同的命令I am root!来打印?我是否需要一些开关或以某种方式更改字符串?
我有一个脚本,显示目录中包含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)
如何在花括号内使用变量?
当我尝试提交此内容时,服务器将消息发回给我
"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)
我已经尝试了在它周围加上引号并转义引号的其他变体,但无济于事,但如果您认为这是问题,请随时提出一种格式。
我很难使用 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中单引号和双引号之间的区别,即单引号将不允许任何插值。但是我遇到了这样一种情况,单引号实际上是插值变量值的唯一方法。为了示例,我创建了一个名为“ 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 脚本之一包含此测试:
if [ ! -v "$3" ]; then
exit
else
...
fi
Run Code Online (Sandbox Code Playgroud)
有没有办法在 $3 参数中注入数据来执行一些令人讨厌的事情?(我的脚本以 suid 权限运行并包含敏感变量...)
谢谢
我希望能够使用 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 参数与变量和字符串结合使用?
我在 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) 我试图找到一种方法,在此命令中使用变量将 -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) 我编写了这个脚本:
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)
有任何想法吗?
我试图从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)
请指教.