相关文章推荐
豪气的哑铃  ·  Linux系统/etc/resolv.con ...·  1 年前    · 
小眼睛的手套  ·  Lua vs tcl-掘金·  1 年前    · 
温柔的电梯  ·  无法安装mysqlclient·  1 年前    · 
喝醉的消防车  ·  java8 ...·  1 年前    · 

原因

原来是因为管道|创建了新的子进程,而子进程是在独立的进程空间(Context)运行了. 需要跟父进程通信的话, 得使用进程间通信机制. 不是简单的变量问题。

解决办法:

1、命名管道

shell中引用while中的变量 - Shell-Chinaunix

mkfifo pipe; exec 3<>pipe; #fd3 指向pipe echo "a b c" |while read line1 line2 echo $line1 >&3 # 写入fd3 read -u3 var #读取变量 echo $var rm pipe; exec 3>&-

2、改为管道输入为文件输入

shell while内获取外部变量内容 - 李秋 - 博客园

#!/bin/sh
x="this is the initial value of x"
while read line;do
        x="$line"
        echo $x
done < /tmp/tmp
echo x = $x

3、输入重定向

shell while内获取外部变量内容 - 李秋 - 博客园

#!/bin/sh
x="this is the initial value of x"
exec 3<&0         # save stdin 将标准输入重定向到文件描述符3
exec < /tmp/tmp # 输入文件
while read line; do
        x=$line
        echo $x
exec 0<&3        # restore stdin
echo x = $x

4、临时文件桥接

MY_UUID=$(uuidgen)#或者$(cat /proc/sys/kernel/random/uuid)
MY_TMP_FILE_PATH=/tmp/${MY_UUID}.txt
x="this is the initial value of x"
while read line
x=$line
echo $x
done < ${MY_TMP_FILE_PATH}
echo $x
例子:[liuhao@slave04 ~]$ cat test.sh #! /bin/sh x=1echo "adasd" | while read linedo x=2 doneecho $x 运行结果是[liuhao@slave04 ~]$ sh test.sh 1原因原来是因为管道|创建了新的子进程,而子进程是在独立的进程空间(Context)运行了. 需要跟父进程通信的话, 得使用进程间通信机制. 不是简单的变量问题。解决办法:1、命名管...
自学 shell 编程——第3讲(for语句/while语句/until语句) 三种 循环 语句:for语句/while语句/until语句。 1. for 循环 语句:for 循环 变量 in 次数-do- 循环 体-done 以一个例子作为练习,熟悉for 循环 语句。这里比较难的是次数(就是 循环 限制)的书写 #在定义 变量 时定义属性 declare -i num=2 #将 变量 nun直接定义为整数型, 为2 num=$num*2;echo $num #输出4;
read arg1 arg2 arg3 arg4 …, read 是一個用來賦 的命令,它需要从目标输入获得 ,然后把这些 按照位置依次赋 变量 arg1、arg2、arg3、arg4…,输入的时候以空格(可以有连续多个)作为分隔符 command命令的输出作为 read 循环 的输入,这种结构长用于处理超过一行的输出,当然awk也很擅长做这种事 read 通过输入重定向,把file的第一行所 刚开始看到这种结构时,很难理解 对 循环 重定向的输入可适用于 循环 的所有需要从标准输入读取数据的命令; 对 循环 重定向的输出可适用于 循环 的所有需要向标准输出写入数据的命令; 当在 循环 内部 显式地使用输入或输出重定向, 内部 重定向覆盖外部重定向。 上面的whi 其 ,`optstring`是一个包含选项字母的字符串,每个字母表示一个选项。如果字母后面有冒号,则表示该选项需要一个参数。`name`是一个 变量 名,用于存储当前选项字母。`arg ...`是要解析的命令行参数。 下面是一个示例代码: #!/bin/csh set arg1 = "" set arg2 = "" while (getopts "a:b:" option) switch ($option) case "a": set arg1 = $OPTARG breaksw case "b": set arg2 = $OPTARG breaksw case "?": echo "Invalid option: -$OPTARG" >&2 exit 1 endsw echo "arg1 = $arg1" echo "arg2 = $arg2" 在这个例子 ,我们定义了两个选项 `-a` 和 `-b`,它们分别对应 变量 `arg1`和`arg2`。当解析到选项字母时,会将其存储在`name` 变量 ,同时如果该选项需要参数,则将参数存储在`OPTARG` 变量 。在 循环 结束后,我们可以输出`arg1`和`arg2`的 ,以验证解析结果是否正确。 CONFIG_CROSS_PREFIX= # Build with debug logging. Turn off for performance testing and normal usage CONFIG_DEBUG=n # Treat warnings as errors (fail the build on any warning). CONFIG_WERROR=n # Build with link-time optimization. CONFIG_LTO=n # Generate profile guided optimization data. CONFIG_PGO_CAPTURE=n # Use profile guided optimization data. CONFIG_PGO_USE=n # Build with code coverage instrumentation. CONFIG_COVERAGE=n # Build with Address Sanitizer enabled sed -r 's/CONFIG_([[:alnum:]_]+)=(.*)/CONFIG[\1]=\2/g' ./CONFIG > ./CONFIG.sh declare -A CONFIG source ./CONFIG.sh echo ${CONFIG[ARCH]} 【shell】shell 数组处理 bandaoyu: 关联数组: #!/bin/bash declare -A CONFIG #这个不能少 CONFIG[os]="linux" CONFIG[ker]="57-6" CONFIG[arch]="x86_64" echo "os:${CONFIG[os]}" echo "kernel:${CONFIG[ker]}" echo "arch:${CONFIG[arch]}" 【cmake】CMakeList添加库|添加头文件|添加路径|add_executable、add_library、target_link_libraries|添加编译选项|宏开关 bandaoyu: include(CPack) 是什么意思? 是把/usr/share/cmake/Modules/CPack.cmake 导入进来的意思吗 是的,`include(CPack)`是将`CPack`模块导入到`CMakeLists.txt`中的命令。`CPack`模块是CMake的一个内置模块,它提供了打包项目的功能。 `CPack`模块定义了生成各种不同类型的打包文件(例如RPM、DEB、ZIP等)的规则和选项。通过使用`include(CPack)`,你可以在项目的`CMakeLists.txt`中调用`CPack`的相关函数和变量,以配置和生成打包文件。 导入`CPack.cmake`模块后,你可以在`CMakeLists.txt`中使用`CPack`提供的命令和变量来定义打包配置,例如设置打包类型、指定打包文件的名称、版本和安装路径等。 值得注意的是,对于某些CMake版本,`include(CPack)`可能已经内置在`CMake`中,无需额外导入。所以,如果在项目的`CMakeLists.txt`中找到`include(CPack)`,那么你可以直接使用相关的`CPack`命令和变量。如果找不到这行代码,你可以手动导入`CPack`模块或者检查你所使用的CMake版本。