我把这个字符串存储在一个变量中:
IN="bla@some.com;john@home.com"
Run Code Online (Sandbox Code Playgroud)
现在我想通过;分隔符拆分字符串,以便我有:
ADDR1="bla@some.com"
ADDR2="john@home.com"
Run Code Online (Sandbox Code Playgroud)
我不一定需要ADDR1和ADDR2变量.如果它们是阵列的元素甚至更好.
根据以下答案的建议,我最终得到了以下内容,这就是我所追求的:
#!/usr/bin/env bash
IN="bla@some.com;john@home.com"
mails=$(echo $IN | tr ";" "\n")
for addr in $mails
do
echo "> [$addr]"
done
Run Code Online (Sandbox Code Playgroud)
输出:
> [bla@some.com]
> [john@home.com]
Run Code Online (Sandbox Code Playgroud)
有一个涉及设置Internal_field_separator(IFS)的解决方案;.我不确定该答案发生了什么,你如何重置IFS为默认值?
RE:IFS解决方案,我试过这个并且它可以工作,我保持旧的IFS然后恢复它:
IN="bla@some.com;john@home.com"
OIFS=$IFS
IFS=';'
mails2=$IN
for x in $mails2
do
echo "> [$x]"
done
IFS=$OIFS
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我试过的时候
mails2=($IN)
Run Code Online (Sandbox Code Playgroud)
我只是在循环打印时得到第一个字符串,没有括号围绕$IN它工作.
我已经设置了ssh代理,我可以在Bash脚本中运行外部服务器上的命令,例如:
ssh blah_server "ls; pwd;"
Run Code Online (Sandbox Code Playgroud)
现在,我真正想做的是在外部服务器上运行很多长命令.将所有这些包含在引号之间会非常难看,而且我宁愿多次避免ssh'ing以避免这种情况.
那么,有没有一种方法可以用括号括起来的一个方法做到这一点?我正在寻找以下内容:
ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
Run Code Online (Sandbox Code Playgroud)
基本上,只要它干净,我会对任何解决方案感到满意.
为了澄清,我在谈论这是一个更大的bash脚本的一部分.其他人可能需要处理脚本,所以我想保持清洁.我不希望有一个bash脚本,其中一行看起来像:
ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"
Run Code Online (Sandbox Code Playgroud)
因为它非常丑陋且难以阅读.
我想以myscript这种方式调用文件:
$ ./myscript -s 45 -p any_string
Run Code Online (Sandbox Code Playgroud)
要么
$ ./myscript -h #should display help
$ ./myscript #should display help
Run Code Online (Sandbox Code Playgroud)
我的要求是:
getopt 这里得到输入参数-s存在,如果没有返回错误-s是45还是90-p存在并且之后有输入字符串./myscript -h或只是./myscript显示帮助我到目前为止尝试了这段代码:
#!/bin/bash
while getopts "h:s:" arg; do
case $arg in
h)
echo "usage"
;;
s)
strength=$OPTARG
echo $strength
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
但是使用该代码我会收到错误.怎么用Bash和getopt?
如果我在Mac或Linux中有实际文件和Bash shell,我如何查询cert文件何时到期?假设我有csr,key,pem和chain文件,这不是一个网站,而是实际上是证书文件本身.
我有这样的剧本
genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5
Run Code Online (Sandbox Code Playgroud)
我想在变量中获取genhash生成的流.如何将其重定向到变量$hash以在条件内进行比较?
if [ $hash -ne 0 ]
then echo KO
exit 0
else echo -n OK
exit 0
fi
Run Code Online (Sandbox Code Playgroud) 我有一个问题,将pwd命令的内容放入shell变量中,稍后我将使用它.
这是我的shell代码(循环不会停止):
#!/bin/bash
pwd= `pwd`
until [ $pwd = "/" ]
do
echo $pwd
ls && cd .. && ls
$pwd= `pwd`
done
Run Code Online (Sandbox Code Playgroud)
你能发现我的错误吗?
有两种方法可以捕获命令行的输出bash:
Legacy Bourne shell反手``:
var=`command`
Run Code Online (Sandbox Code Playgroud)$() 语法(据我所知,特定于Bash,或至少不受原始Bourne等非POSIX旧shell支持)
var=$(command)
Run Code Online (Sandbox Code Playgroud)与反引号相比,使用第二种语法有什么好处吗?或两者完全相同?
我正在尝试将cURL的输出分配给变量,如下所示:
#!/bin/sh
$IP=`curl automation.whatismyip.com/n09230945.asp`
echo $IP
sed s/IP/$IP/ nsupdate.txt | nsupdate
Run Code Online (Sandbox Code Playgroud)
但是,当我运行脚本时,会发生以下情况:
Run Code Online (Sandbox Code Playgroud)./update.sh: 3: =[my ip address]: not found
如何才能$IP正确输出?
有人能告诉我是否应该在shell脚本中包含变量的引号?
例如,以下是正确的:
xdg-open $URL
[ $? -eq 2 ]
Run Code Online (Sandbox Code Playgroud)
要么
xdg-open "$URL"
[ "$?" -eq "2" ]
Run Code Online (Sandbox Code Playgroud)
如果是这样,为什么?
我见过这个例子:
hello=ho02123ware38384you443d34o3434ingtod38384day
echo ${hello//[0-9]/}
Run Code Online (Sandbox Code Playgroud)
遵循以下语法: ${variable//pattern/replacement}
不幸的是,该pattern字段似乎不支持完整的正则表达式语法(如果我使用.或者\s,例如,它尝试匹配文字字符).
如何使用完整的正则表达式语法搜索/替换字符串?