shell 变量问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 变量问题相关的知识,希望对你有一定的参考价值。

想问下,如何能正常吃到$newref这个变量。因为sed后跟的是单引号。所以吃不到啊。怎么办?改双引号我试过弹错啊。另外i后面为什么有\ ??,因为我的sed版本太低啊!版本3.02
求大神解救。

    这里没用到替换命令s,而是用到了插入命令i,一条命令若换行写,需要以\\作为标记;若写在一行,就不需要了。后面是i命令要插入的数据。

    只有在替换命令s里,才能将/改为#或其他字符,即 s/A/B/ 可以写为 s#A#B# 

    /正则表达式/  必须要这个形式

 

单引号会屏蔽特殊符号的特殊含义,这里就是$被屏蔽了,被当作普通字符而无法取变量值。

通常解决方案有两个:

    将sed的单引号改为双引号,但楼主这里貌似由于版本太低行不通。

    将shell变量拿到sed的单引号外面,即将一个单引号对拆分为两个,中间断开。单引号里面是sed环境,外面就是shell环境,shell变量就可以正常取值了。

sed \'/\'$newref\'/i\\
123123123123123\' fix.txt
参考技术A sed '/'$newref'/i\\     # 把变量用单引号框住

        例如:sed '/'$newref'/i\\
              123123123123123' fix.txt

参考技术B 有两个错误(少了s, 表示取代; $是特殊符号,前面要加\),正确的是:
sed "s/\$newref/i123123" fix.txt

如何在makefile中获取shell环境变量?

【中文标题】如何在makefile中获取shell环境变量?【英文标题】:How to get a shell environment variable in a makefile? 【发布时间】:2015-05-07 13:50:41 【问题描述】:

当我进入时在shell中

echo $demoPath

打印出来

/usr/local/demo

如何在 makefile 中获取此变量 $demoPath 的值?

【问题讨论】:

【参考方案1】:

如果您已导出环境变量:

export demoPath=/usr/local/demo

您可以在makefile 中简单地按名称引用它(make 导入您设置的所有环境变量):

DEMOPATH = $demoPath    # Or $(demoPath) if you prefer.

如果您没有导出环境变量,则在您导出它之前无法访问它,或者除非您在命令行上显式传递它:

make DEMOPATH="$demoPath" …

如果您使用的是 C shell 衍生版本,请将 setenv demoPath /usr/local/demo 替换为 export 命令。

【讨论】:

"make 导入你设置的所有环境变量"。它有效!不错~,我以前不知道这个,非常感谢。 @jonathan_leffler 我被你的回答启发了,我做了一些不同的事情。我在调用 make 之前设置了 envvar 而不导出它:demoPath=/usr/local/demo make。您可能想对其进行测试,并可能更新您的答案。干杯! @A.D.是的,这是为特定命令设置环境变量值的另一种机制。这与询问如何访问现有变量的值而不是如何动态创建变量的问题有点相切。它并不妨碍它在某些时候成为一种有用的技术。【参考方案2】:
all:
    echo $PATH

或者只为一个命令更改 PATH:

all:
    PATH=/my/path:$PATH cmd

【讨论】:

【参考方案3】:

对于那些想要一些官方文件来确认行为的人

make 中的变量可以来自 make 运行的环境。 make 启动时看到的每个环境变量都是 转换为具有相同名称和值的 make 变量。 但是,makefile 中的显式分配,或使用命令 参数,覆盖环境。 (如果指定了“-e”标志, 然后环境中的值会覆盖 makefile 中的分配。

https://www.gnu.org/software/make/manual/html_node/Environment.html

【讨论】:

-e 提示是金!但是你忽略了一个重要的评论:“但这不是推荐的做法”,因为现在 any 变量可以被环境覆盖。【参考方案4】:

如果您在同一个脚本中导出变量,您将需要使用两个 $$ 而不是 $, 如果您的 Makefile 看起来像这样:

target:
        . ./init.sh; \
        echo $HOMEPATH:$$FOO;

init.sh 脚本中导出变量 FOO

$ cat ./init.sh
#!/bin/bash
export FOO=foo:

这样,当你运行 make target 时,在脚本运行之前定义的环境变量 HOMEPATH 将仅使用一个 $ 显示,但环境变量 在同一脚本中导出的 FOO 需要 $$ 才能显示

【讨论】:

以上是关于shell 变量问题的主要内容,如果未能解决你的问题,请参考以下文章

shell 变量问题

shell中分别给null和unset的变量赋值问题

linux下shell脚本中sqlplus调用shell变量的问题

shell中for循环变量有空格的问题——IFS变量

关于使用 shell 变量的说明 [关闭]

Shell 脚本:使用变量定义路径