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 line
    do
        对$line的处理命令
    done < filename.txt

    

常用的第二种方法是(cat加管道的方法):

    cat filename.txt | while read line
    do
        对$line的处理命令
    done

针对这2种方法,举例如下:

$ cat filename.txt
Jack
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,看完例子就知道答案了:

$ cat filename.txt
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的变量。

正文

  1. 变量的定义

变量名的命名规则

  1. 字母、数字、下划线

  2. 不以数字开头

  3. 变量的赋值

在赋值的时候不能出现空格 a =123,在等号前面有一个空格,那么会报错。

这是因为空格之后当做另外一条命令。

然后可以使用let 进行复制,let a=10+20 这个可以进行计算复制。

同样如果想要命令赋值,可以这样 l=ls,那么后面l就表示了ls的意思。

将命令结果赋值给变量,使用$()或者``.

使用let c=$(ls -l /etc)

变量有空格等特殊字符可以包含在""或者\'\'中。

  1. 变量的引用

例子:

string1="hello word"
echo $string1
或者
echo $string1
  1. 变量的作用范围

变量的作用范围,默认为当前的shell为变量的作用范围。

这里有一个例子,当复制为a=1,然后使用bash,开启了一个子shell,然后发现无法访问a了,说明子shell和父shell不互通变量。

那么如果想两个脚本变量互通怎么办?source x.sh,这样就可以了。

  1. 系统环境变量

那么如果想让子shell和父shell互通变量怎么办?可以使用export来实现。

export 其实这就全局了的意思了,那么如果用完之后最好unset去删除。

这其实就是环境变量了,那么可以通过env来查看一下。

说起环境变量,那么$Path 是比较重要的,可以自我了解一下。

然后还有一个就是ps1了。

这个就是我们显示的了。

预定义变量: $?、$$、$0

就简单介绍一下这三个。
$? 表示上一条命令是否正确执行,正确的就是0了,其他都是错误的。

$$ 表示当前进程的pid

$0 为当前进程的名称:

位置变量:$1 $2 $3

这些表示的是第几个变量的意思。

然后关于默认值的问题:$2-_

这个意思是如果2没传的话,那么默认就是_。

  1. 环境变量配置文件

配置文件有:

  1. /etc/profile

  2. /etc/profile.d/

  3. ~/.bash_profile

  4. ~/bashrc

  5. /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变量重新赋值问题的主要内容,如果未能解决你的问题,请参考以下文章

shell中$1赋值给变量,此变量却是空的,为啥?

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

shell环境变量与变量赋值

linux shell 截取内容,赋值给变量

shell变量用grep怎么不能赋值

awk的结果怎么赋值给Shell变量