我在Linux上使用bash shell.我有这个简单的脚本......
#!/bin/bash
TEMP=`sed -n '/'"Starting deployment of"'/,/'"Failed to start context"'/p' "/usr/java/jboss/standalone/log/server.log" | tac | awk '/'"Starting deployment of"'/ {print;exit} 1' | tac`
echo $TEMP
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此脚本时
./temp.sh
Run Code Online (Sandbox Code Playgroud)
所有输出都打印出来没有回车/换行.不知道我将输出存储到$ TEMP的方式,还是echo命令本身.
如何将命令的输出存储到变量并保留换行符/回车符?
我正在尝试将文件列表存储到一个数组中,然后再次遍历该数组.下面是我ls -ls从控制台运行命令时得到的内容.
total 40
36 -rwxrwxr-x 1 amit amit 36720 2012-03-31 12:19 1.txt
4 -rwxrwxr-x 1 amit amit 1318 2012-03-31 14:49 2.txt
Run Code Online (Sandbox Code Playgroud)
我写的以下bash脚本将上述数据存储到bash数组中.
i=0
ls -ls | while read line
do
array[ $i ]="$line"
(( i++ ))
done
Run Code Online (Sandbox Code Playgroud)
但是当我echo $array,我什么都没得到!
仅供参考,我这样运行脚本: ./bashscript.sh
我已设法使用AWS CloudWatch日志代理将我的应用程序日志推送到AWS Cloudwatch.但ColudWatch Web控制台似乎没有提供允许您从中下载/导出日志数据的按钮.
我有什么想法可以实现这个目标?
我生成一个包含所有args的bash变量,这些args包含空格.当我用这些args启动命令时 - 例如.ls $ args - 引号未正确解释.这是一个示例 - 还创建和擦除所需的文件.
#!/bin/bash
f1="file n1"
f2="file n2"
# create files
touch "$f1" "$f2"
# concatenate arguments
args="\"$f1\" \"$f2\""
# Print arguments, then launch 'ls' command
echo "arguments :" $args
ls $args
# delete files
rm "$f1" "$f2"
Run Code Online (Sandbox Code Playgroud)
有了这个,我对"file,n1","file and n2"有一些"没有这样的文件"错误
我有一个功能,如:
getServers() {
curl -s -X GET ...
}
Run Code Online (Sandbox Code Playgroud)
输出是一个复杂的 JSON 字符串。我可以像这样解析 JSON:
serverId=$(getServers | jq -r ".[] | select(whatever...)")
echo $serverId
Run Code Online (Sandbox Code Playgroud)
但是如果我将函数调用的输出存储在一个变量中,我会收到一个错误:
servers=$(getServers)
echo $servers | jq .
# jq can not process this
# parse error: Invalid string: control characters from U+0000 through
echo "$servers" | jq .
# does not work either
Run Code Online (Sandbox Code Playgroud)
U+001F 必须在第 ...
即使我$servers包含与函数调用相同的值,也jq无法处理它。这里发生了什么事?
$ jq --version
jq-1.5
这不是一个重复的问题!这个问题的根源在于\r\n字符串中的存在。添加引号并不能解决问题。
将字符串通过管道输送到tr '\r\n' ' ':
servers=$(getServers)
echo $servers …Run Code Online (Sandbox Code Playgroud) 我只是想知道如何在单引号内回显变量(我使用单引号,因为字符串中有引号).
echo 'test text "here_is_some_test_text_$counter" "output"' >> ${FILE}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激
我在使用grep命令时遇到了一些问题.
我找到了只显示grep搜索的最后一行的方法:
grep PATERN FILE_NAME | tail -1
Run Code Online (Sandbox Code Playgroud)
我还找到了在多个选定文件中进行grep搜索的方法:
find . -name "FILE_NAME" | xargs -I name grep PATERN name
Run Code Online (Sandbox Code Playgroud)
现在我想只得到每个文件的grep结果的最后一行.我试过这个:
find . -name "FILE_NAME" | xargs -I name grep PATERN name | tail -1
Run Code Online (Sandbox Code Playgroud)
这只返回最后一个文件的最后一个值,我希望每个文件都有最后一个匹配的patern.
我的问题:
#!/bin/bash
function testFunc(){
echo "param #1 is :" $1
echo "param #2 is :" $2
}
param1="param1"
param2="param2"
testFunc $param1 $param2
Run Code Online (Sandbox Code Playgroud)
这样输出是:
param #1 is : param1
param #2 is : param2
Run Code Online (Sandbox Code Playgroud)
但是当我将param1设置为空字符串时:
param1=""
Run Code Online (Sandbox Code Playgroud)
然后输出如下:
param #1 is : param2
param #2 is :
Run Code Online (Sandbox Code Playgroud)
我想问题是当第一个参数为空时,它没有被声明,所以它实际上不会作为函数参数传递.
如果这是问题,那么有没有办法在bash中声明变量"空字符串",或者是否有任何解决方法来获得预期的行为?
注意:如果我调用这样的函数,它按预期工作:
testFunct "" $param2
Run Code Online (Sandbox Code Playgroud)
但我想保持代码清洁.
更新:
我最近发现-u了一个标志,如果即将使用未绑定的变量,它会引发错误.
$ bash -u test.sh
param #1 is : param1
test.sh: line 5: $2: unbound variable
Run Code Online (Sandbox Code Playgroud) 我正在尝试将命令输出重定向到变量:
OUTPUT=$(sudo apache2ctl configtest)
Run Code Online (Sandbox Code Playgroud)
然后阅读它:
echo $OUTPUT
Run Code Online (Sandbox Code Playgroud)
运行时输出如下:
19:19:12 user@user ~ OUTPUT=$(sudo apache2ctl configtest)
Syntax OK
Syntax OK
Run Code Online (Sandbox Code Playgroud)
但变量保持空白.我已经尝试过相同的其他命令,一切正常.
OUTPUT=$(ls -l)
Run Code Online (Sandbox Code Playgroud)
这会将文件列表写入变量,OUTPUT以便以后可以读取.我该怎么做才能让它发挥作用?