原因
原来是因为管道|创建了新的子进程,而子进程是在独立的进程空间(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:
【cmake】CMakeList添加库|添加头文件|添加路径|add_executable、add_library、target_link_libraries|添加编译选项|宏开关
bandaoyu: