有人能告诉我是否应该在shell脚本中包含变量的引号?
例如,以下是正确的:
xdg-open $URL
[ $? -eq 2 ]
Run Code Online (Sandbox Code Playgroud)
要么
xdg-open "$URL"
[ "$?" -eq "2" ]
Run Code Online (Sandbox Code Playgroud)
如果是这样,为什么?
如果以下示例将IFS环境变量设置为换行符...
IFS=$'\n'
Run Code Online (Sandbox Code Playgroud)
我知道IFS环境变量是什么,\n字符是什么(换行),但为什么不使用以下形式:(
IFS="\n"哪个不起作用)?
例如,如果我想循环遍历文件的每一行并想要使用for循环,我可以这样做:
for line in (< /path/to/file); do
echo "Line: $line"
done
Run Code Online (Sandbox Code Playgroud)
但是,除非IFS设置为换行符,否则这将无法正常工作.为了让它工作,我必须这样做:
OLDIFS=$IFS
IFS=$'\n'
for line in (< /path/to/file); do
echo "Line: $line"
done
IFS=$OLDIFS
Run Code Online (Sandbox Code Playgroud)
注意:我不需要另一种方式做同样的事情,我已经知道很多其他的...我只是对此感到好奇,$'\n'并想知道是否有人可以给我一个解释.
#!/usr/local/bin/bash
out=`grep apache README`
echo $out;
Run Code Online (Sandbox Code Playgroud)
通常,grep会在命令行上运行时在单独的行上显示每个匹配项.但是,在上面的脚本中,分隔每个匹配的换行符消失了.有谁知道如何保留换行符?
我正在尝试将一个文本块捕获到变量中,并保持换行符,然后回显它.
但是,当我捕获文本或显示文本时,似乎不会保留换行符.
有关如何实现这一目标的任何想法?
例:
#!/bin/bash
read -d '' my_var <<"BLOCK"
this
is
a
test
BLOCK
echo $my_var
Run Code Online (Sandbox Code Playgroud)
输出:
这是一个测试
期望的输出:
这个
是
一个
测试
我想将grep结果赋给变量以供进一步使用:
lines=`cat abc.txt | grep "hello"`
Run Code Online (Sandbox Code Playgroud)
但我发现$ lines不再包含换行符.所以,当我这样做
echo $lines
Run Code Online (Sandbox Code Playgroud)
只打印一行.我如何保留换行符,所以当我回显$行时,它与cat abc.txt |相同 grep"你好".
我正在编写一个shell脚本,它将命令的输出存储在变量中,处理输出,然后回显结果.这是我得到的:
stuff=$(diff -u pens tape)
# process the output
echo $stuff
Run Code Online (Sandbox Code Playgroud)
问题是,我从运行脚本获得的输出是这样的:
--- pens 2009-09-27 10:29:06.000000000 -0400 +++ tape 2009-09-18 16:45:08.000000000 -0400 @@ -1,4 +1,2 @@ -highlighter -marker -pencil -POSIX +masking +duct
Run Code Online (Sandbox Code Playgroud)
虽然我期待这个:
--- pens 2009-09-27 10:29:06.000000000 -0400
+++ tape 2009-09-18 16:45:08.000000000 -0400
@@ -1,4 +1,2 @@
-highlighter
-marker
-pencil
-POSIX
+masking
+duct
Run Code Online (Sandbox Code Playgroud)
看起来新行字符正在以某种方式被删除.我如何让他们说出来?
我想从git status变量中捕获颜色输出并稍后打印.
到目前为止,我已经达到:
status=$(git status -s)
echo -e "$status"
Run Code Online (Sandbox Code Playgroud)
上面的脚本保持换行完整(thx到捕获多行输出到Bash变量)但从输出中删除颜色.
有没有办法保持变量中的颜色并回显它?
我有像这样修改文件的bash脚本
sed -i "/hello world/d" /etc/postfix/virtual
Run Code Online (Sandbox Code Playgroud)
我从Web应用程序运行此脚本.sed命令在该目录中创建临时文件,但Web应用程序工作的用户无权在该目录中创建文件.我不想为该文件夹的用户授予更多权限.是否可以为sed命令指定临时文件位置?
我是linux新手,很抱歉,如果我的问题太容易了,但我找不到任何解决方案.
谢谢!
我有一个看起来像这样的文件:
1
2
AA
4
5
AA BB
7
8
AA BB CC
10
11
AA BB CC DD
Run Code Online (Sandbox Code Playgroud)
我使用awk只提取每一nth行n=3.
>>awk 'NR%3==0' /input/file_foo >> output/file_foobar
Run Code Online (Sandbox Code Playgroud)
输出显示在一行中:
AA AA BB AA BB CC AA BB CC DD
Run Code Online (Sandbox Code Playgroud)
.....等等
我希望它显示为:
AA
AA BB
AA BB CC
AA BB CC DD
Run Code Online (Sandbox Code Playgroud)
我尝试使用\n,printf使用\n等等,但它不能像我期望的那样工作.请指教.
可能重复:
捕获多行输出到bash变量
我有可能是一个基本的脚本问题,但我无法在任何地方找到答案.
我有一个处理文件的awk脚本,并吐出一系列已禁用的系统.当我从命令行手动调用它时,我得到格式化输出:
$awk -f awkscript datafile
The following notifications are currently disabled:
host: bar
host: foo
Run Code Online (Sandbox Code Playgroud)
我正在编写一个包装脚本来从我的crontab调用,它将运行awk脚本,确定是否有任何输出,如果有,则给我发电子邮件.它看起来像(简化):
BODY=`awk -f awkscript datafile`
if [ -n "$BODY" ]
then
echo $BODY | mailx -s "Disabled notifications" me@mail.address
else
echo "Nothing is disabled"
fi
Run Code Online (Sandbox Code Playgroud)
当以这种方式运行,并通过echo $BODY在脚本中添加一个确认时,输出被剥离格式化(换行符主要是我关注的),所以我得到的输出看起来像:
The following notitifications are currently disabled: host: bar host: foo
Run Code Online (Sandbox Code Playgroud)
我试图找出如果我手动运行命令时如何保留存在的格式.
到目前为止我尝试过的事情:
echo -e `cat datafile | awkscript` > /tmp/tmpfile
echo -e /tmp/tmpfile
Run Code Online (Sandbox Code Playgroud)
我试过这个,因为在我的系统(Solaris 5.10)上,使用echo而没有-e忽略标准转义序列,如\n.没工作.我检查了tmp文件,它没有任何格式,因此在存储输出时会出现问题,而不是在打印输出时.
BODY="$(awk -f awkscript datafile)"
echo -e "$BODY"
Run Code Online (Sandbox Code Playgroud)
我试过这个,因为我能找到的一切,包括stackoverflow上的其他一些问题,说问题是shell如果没有引用,它会用空格替换空格代码.没工作. …