shell变量重新赋值问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell变量重新赋值问题相关的知识,希望对你有一定的参考价值。
#! /bin/sh
bdate=$(date +%Y%m%d)
bl=false
readFile()
cat filename.txt | while read line
do
str=$line##*/
if [ $bdate = $str ] ; then
echo $bdate "File already exists. Do you want to overwrite the existing file?"
echo "Please enter a yes or no:"
bl=true
echo "x = $bl" //打印的是 x = true
#readoper
break
fi
done < filename.txt
readFile
echo $bl
最后打印的是false,说明我重新赋值是不成功的?本人初学,还请指教
先不正面回答问题。先谈一个脚本中可疑之处。
在对文件filename.txt的每一行进行相同或有规律的处理时,常用2种方法。
常用的第一种方法是(就是文件内容输入重定向的方法):
while read linedo
对$line的处理命令
done < filename.txt
常用的第二种方法是(cat加管道的方法):
cat filename.txt | while read linedo
对$line的处理命令
done
针对这2种方法,举例如下:
$ cat filename.txtJack
Mike
Rose
$ cat a1.sh
#!/bin/bash
while read line
do
echo "The name is $line"
done < filename.txt
$ cat a2.sh
#!/bin/bash
cat filename.txt | while read line
do
echo "My name is $line"
done
$ a1.sh (或者运行./a1.sh)
The name is Jack
The name is Mike
The name is Rose
$ a2.sh (或者运行./a2.sh)
My name is Jack
My name is Mike
My name is Rose
你在上面所提供的脚本中,cat加管道的方法(cat filename.txt | while...)、文件内容输入重定向的方法(...done < filename.txt )同时使用了,可能不算是问题,但几乎没有同时使用的。
下面言归正传。
下面的例子,一个输出flase, 一个输出true,看完例子就知道答案了:
Jack
Mike
Rose
$ cat b1.sh
#!/bin/bash
bl=false
cat filename.txt | while read line
do
bl=true
echo "x=$bl"
done
echo $bl
$ cat b2.sh
#!/bin/bash
bl=false
while read line
do
bl=true
echo "x=$bl"
done < filename.txt
echo $bl
$ b1.sh (或者运行./b1.sh)
x=true
x=true
x=true
false
$ b2.sh (或者运行./b2.sh)
x=true
x=true
x=true
true
供参考,谢谢!
参考技术A ./表示执行当前目录下某个可执行文件,这个文件不一定是bash脚本,但是sh方式就只能执行shell脚本,如果一个二进制可执行程序你用sh ./binExample这种方式执行,会报错的。重新点亮shell————变量[三]
前言
简单介绍一下shell的变量。
正文
- 变量的定义
变量名的命名规则
-
字母、数字、下划线
-
不以数字开头
-
变量的赋值
在赋值的时候不能出现空格 a =123,在等号前面有一个空格,那么会报错。
这是因为空格之后当做另外一条命令。
然后可以使用let 进行复制,let a=10+20 这个可以进行计算复制。
同样如果想要命令赋值,可以这样 l=ls,那么后面l就表示了ls的意思。
将命令结果赋值给变量,使用$()或者``.
使用let c=$(ls -l /etc)
变量有空格等特殊字符可以包含在""或者\'\'中。
- 变量的引用
例子:
string1="hello word"
echo $string1
或者
echo $string1
- 变量的作用范围
变量的作用范围,默认为当前的shell为变量的作用范围。
这里有一个例子,当复制为a=1,然后使用bash,开启了一个子shell,然后发现无法访问a了,说明子shell和父shell不互通变量。
那么如果想两个脚本变量互通怎么办?source x.sh,这样就可以了。
- 系统环境变量
那么如果想让子shell和父shell互通变量怎么办?可以使用export来实现。
export 其实这就全局了的意思了,那么如果用完之后最好unset去删除。
这其实就是环境变量了,那么可以通过env来查看一下。
说起环境变量,那么$Path 是比较重要的,可以自我了解一下。
然后还有一个就是ps1了。
这个就是我们显示的了。
预定义变量: $?、$$、$0
就简单介绍一下这三个。
$? 表示上一条命令是否正确执行,正确的就是0了,其他都是错误的。
$$ 表示当前进程的pid
$0 为当前进程的名称:
位置变量:$1 $2 $3
这些表示的是第几个变量的意思。
然后关于默认值的问题:$2-_
这个意思是如果2没传的话,那么默认就是_。
- 环境变量配置文件
配置文件有:
-
/etc/profile
-
/etc/profile.d/
-
~/.bash_profile
-
~/bashrc
-
/etc/bashrc
这里有很多配置文件,但是这些文件还是有区别的。
比如在etc目录下的,那么就是所有用户通用的了。
那么这里可以看到有profile的,也有没有profile的。
su [user]切换到其他用户,但是不切换环境变量,su - [user]则是完整的切换到新的用户环境。
如果使用,su - [user],那么切换的时候会加载/etc/profile ~/.bash_profile ~/bashrc /etc/bashrc 执行顺序也是如此,这个还是比较关键的,毕竟后面的执行顺序要大于前面的。
如果使用su [user] 那么只会加载~/bashrc /etc/bashrc。
通用需要了解的是当我们修改完配置后,配置是不会立即生效的,如果想让其立即生效,那么可以使用source这个命令,进行重新加载。
结
下一节就介绍具体的语法了。
以上是关于shell变量重新赋值问题的主要内容,如果未能解决你的问题,请参考以下文章