相关疑难解决方法(0)

何时在shell变量周围包装引号?

有人能告诉我是否应该在shell脚本中包含变量的引号?

例如,以下是正确的:

xdg-open $URL 
[ $? -eq 2 ]
Run Code Online (Sandbox Code Playgroud)

要么

xdg-open "$URL"
[ "$?" -eq "2" ]
Run Code Online (Sandbox Code Playgroud)

如果是这样,为什么?

unix linux bash shell quotes

145
推荐指数
4
解决办法
5万
查看次数

IFS = $'\n'的确切含义是什么?

如果以下示例将IFS环境变量设置为换行符...

IFS=$'\n'
Run Code Online (Sandbox Code Playgroud)
  • 什么是美元符号的意思 完全相同
  • 在这个具体案例中它做了什么?
  • 我在哪里可以阅读有关此特定用法的更多信息(Google不允许在搜索中使用特殊字符,否则我不知道该寻找什么)?

我知道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'并想知道是否有人可以给我一个解释.

variables bash shell environment-variables ifs

117
推荐指数
4
解决办法
8万
查看次数

将grep结果赋给shell变量后丢失换行符

#!/usr/local/bin/bash
out=`grep apache README`
echo $out;
Run Code Online (Sandbox Code Playgroud)

通常,grep会在命令行上运行时在单独的行上显示每个匹配项.但是,在上面的脚本中,分隔每个匹配的换行符消失了.有谁知道如何保留换行符?

shell

70
推荐指数
3
解决办法
3万
查看次数

如何在bash中优雅地存储和回显多条线?

我正在尝试将一个文本块捕获到变量中,并保持换行符,然后回显它.

但是,当我捕获文本或显示文本时,似乎不会保留换行符.

有关如何实现这一目标的任何想法?

例:

#!/bin/bash

read -d '' my_var <<"BLOCK"
this
is
a
test
BLOCK

echo $my_var
Run Code Online (Sandbox Code Playgroud)

输出:

这是一个测试

期望的输出:

这个

一个

测试

linux bash scripting

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

如何用换行保留grep结果?

我想将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"你好".

bash

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

Shell脚本打印包含命令输出的变量的内容将删除换行符

我正在编写一个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)

看起来新行字符正在以某种方式被删除.我如何让他们说出来?

linux shell echo

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

捕获彩色输出到bash变量

我想从git status变量中捕获颜色输出并稍后打印.

到目前为止,我已经达到:

status=$(git status -s)
echo -e "$status"
Run Code Online (Sandbox Code Playgroud)

上面的脚本保持换行完整(thx到捕获多行输出到Bash变量)但从输出中删除颜色.

有没有办法保持变量中的颜色并回显它?

variables bash colors

11
推荐指数
2
解决办法
1942
查看次数

如何在linux中为sed命令设置临时文件目录?

我有像这样修改文件的bash脚本

sed -i "/hello world/d" /etc/postfix/virtual
Run Code Online (Sandbox Code Playgroud)

我从Web应用程序运行此脚本.sed命令在该目录中创建临时文件,但Web应用程序工作的用户无权在该目录中创建文件.我不想为该文件夹的用户授予更多权限.是否可以为sed命令指定临时文件位置?

我是linux新手,很抱歉,如果我的问题太容易了,但我找不到任何解决方案.

谢谢!

linux bash sed

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

为什么awk没有打印出换行符?

我有一个看起来像这样的文件:

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只提取每一nthn=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等等,但它不能像我期望的那样工作.请指教.

awk

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

Shell脚本,将命令输出存储在变量中并保留格式

可能重复:
捕获多行输出到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如果没有引用,它会用空格替换空格代码.没工作. …

unix bash shell

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

标签 统计

bash ×7

shell ×5

linux ×4

unix ×2

variables ×2

awk ×1

colors ×1

echo ×1

environment-variables ×1

ifs ×1

quotes ×1

scripting ×1

sed ×1