未将对象引用设置到对象的实例(未将对象引用设置到实例怎么解决)

未将对象引用设置到对象的实例(未将对象引用设置到实例怎么解决)

shell学习笔记

未将对象引用设置到对象的实例(未将对象引用设置到实例怎么解决)

概念


未将对象引用设置到对象的实例(未将对象引用设置到实例怎么解决)

shell是脚本语言,解释型,不需要提前编译。

Shell是用户或应用程序与内核沟通的桥梁。

第一个脚本

创建 first.sh

#!/bin/bash
echo "Hello World!"

运行 sh first.sh 或 http://www.toutiao.com/a6846609650809471501/first.sh

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

可以使用 #!/bin/env bash 解决不同系统路径不一致问题

/bin/bash指明了解释器的具体路径。

echo 命令用于向窗口输出文本。

常用shell

常见的 Shell 有 sh、bash、csh、tcsh、ash 等。

bash shell 是 Linux 的默认 shell,bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。

bash兼容sh意味着,针对sh编写的Shell代码可以不加修改地在bash中运行。

shell 变量

在Bash Shell中,每一个变量的值都是字符串,无论给变量赋值时有没使用引号,值都会以字符串的形式存储,即使将整数或小数赋值给变量,他们也会被视为字符串。

变量定义方式

name="test"
name='test'
name=test

注意: 变量名和等号间不能有空格,如果变量值包含空白字符,就必须使用引号包起来,例如 name=”bom smith”

变量作用域

运行shell时,会同时存在三种变量:

  1. 全局变量 指变量在当前的整个 Shell 会话中都有效。每个 Shell 会话都有自己的作用域,彼此之间互不影响。在 Shell 中定义的变量,默认就是全局变量。
  2. 局部变量 在 Shell 函数中定义的变量默认也是全局变量**,它和在函数外部定义变量拥有一样的效果;要想变量的作用域仅限于函数内部,那么可以在定义时加上 local命令,此时该变量就成了局部变量。
  3. 环境变量 只在当前 Shell 会话中有效,如果使用export命令将它导出,那么它就在所有的子 Shell 中也有效了。

变量使用

变量创建出来后可以在其他地方进行使用。

name=test
echo $name
echo ${name}
#使用$或花括号方式都可以,花括号可以区分边界
#变量使用readonly 则为只读变量name=testreadonly name #name 不能再被修改
#!/bin/bash
for item in java shell python go; 
do    
  echo "this is ${item}"
done

修改变量

定义的变量可以重新进行赋值

#!/bin/bash
name='test'
echo ${name}
name='newvalue'
echo ${name}

删除变量

使用unset可以删除一个变量

#!/bin/bash
name="test"
unset name
echo $name #执行没有输出
#unset 命令不能删除只读变量

将命令的执行结果赋值给变量

value=`commond`
value=${commond}两种方式都可以
value=`who`
echo $value
value=${ls /}
echo $value

如果被替换的命令的输出内容包括多行(也即有换行符),或者含有多个连续的空白符,那么在输出变量时应该将变量用双引号包围,否则系统会使用默认的空白符来填充,这会导致换行无效,以及连续的空白符被压缩成一个。

echo "$value"

字符串

shell中字符串可以用单引号、双引号、也可以不使用引号

单引号和双引号区别

  1. 单引号
  • 单引号里面的任何字符都会原样输出,单引号字符串里面的变量是无效的,也就是变量那一串就只是字符串;
  • 单引号字符中不能出现单独一个的单引号(对单引号使用转义符后也不行),但能成对出现,相当于字符串拼接 s=’abc\’0e’,这个就会报错,而 s=’abc\’0’e’会输出 abc\0e
  1. 双引号
  • 双引号中可以有变量,输出时会先解析里面的变量和命令
  • 双引号也可以出现转义字符
!/bin/bash
name='lr'
echo $name
s1="my name is $name"
echo $s1
s2="my name is "$name""
echo $s2
s3="my name is \"$name\""
echo $s3# 运行结果lrmy name is lrmy name is lrmy name is "lr"

单/双引号使用场景

建议

  • 如果变量的值是数字,那么不加引号 a=1;
  • 如果要将字符串原样输出,就用反引号 str=’单引号中原样输出${test}’;
  • 没有特别要求最好都是用双引号(最常见)。

字符串拼接

#!/bin/bash
name='lr'
s1="hello, $name"  # 双引号中可以直接使用变量
echo $s1
s2="hello, "$name""  # 相当于两对双引号拼接
echo $s2
s3='hello, $name'  # 单引号中变量都当作普通字符串
echo $s3
s4='hello, "$name"'
echo $s4
s5='hello, '$name''  # 相当于两对单引号和变量进行拼接
echo $s5
nick='xy'
s6=$nick$name  # 中间不能有空格
s7="$nick $name"  # 如果是双引号包围,就允许中间有空格
s8=$nick"..."$name  # 中间可以出现其他字符串
s9="$nick...$name"  # 中间也可以这样写
s10="昵称${nick}...${name}名字"
echo $s6 echo $s7 echo $s8 echo $s9 echo $s10
# 运行结果user@PxeCtrlSys:~$ http://www.toutiao.com/a6846609650809471501/test.sh hello, lrhello, lrhello, $namehello, "$name"hello, lrxylrxy lrxy...lrxy...lr昵称xy...lr名字

获取字符串长度

使用 ${#变量名}

#!/bin/bash
name=test
echo ${name}#输出4

截取字符串

格式说明${string:start:length}从 string 字符串的左边索引为 start 的字符开始,向右截取 length 个字符。${string:start}从 string 字符串的左边索引为 start 的字符开始截取,直到最后。${string:0-start:length}从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。${string:0-start}从 string 字符串的右边第 start 个字符开始截取,直到最后。${string#*chars}从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。${string##*chars}从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。${string%*chars}从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。${string%%*chars}从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。

查找字符串

#!/bin/bash
str="I love Python, but I need study Shell"
echo `expr index "$str" SP`  # 查找字符S或者P最先出现的位置,下标以1开始,第8个字符为P,就输入了8# 运行结果8  

数组

bash支持一维数组(但不支持多维数组),并且没有限制数组大小。数组元素的下标从0开始,获取数组元素使用小标,下标可以是整数或算术表达式,其值应大于等于0。

array_name=(value0 value1 value2) #或者array_name=(value0value1...valuen)#赋值array_name[0]=1array_name[1]=2#使用  ${数组名[下标]}arr[0]=1arr[2]=2echo ${arr[@]}  # 使用@或*可以获取数组中的所有元素:  1 2echo ${arr[2]}  # 2echo ${arr[1]}  # 没有的值获取为空#使用 unset arr[index] 删除数组元素,使用 unset arr 删除整个数组,所有元素都会消失

参数传递

向脚本传递参数,脚本内获取参数的格式为: $n。 n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,以此类推…

# test.sh文件内容
#!/bin/bash
echo "执行的文件名:$0"
echo "传递的第一个参数:$1"
echo "传递的第二个参数:$2"
echo "传递的第三个参数:$3"
echo "所有参数:$*"#执行http://www.toutiao.com/a6846609650809471501/test.sh 0 1 2 3 #如果参数个数太多,达到或者超过了 10 个,那么就得用${n}的形式来接收了,例如 ${10}、${23}。{ }的作用是为了帮助解释器识别参数的边界,这跟使用变量时加{ }是一样的效果

参数处理说明$#获取传递到脚本的参数个数$*以一个单字符串显示所有向脚本传递的参数,如 $*就和 “$1 $2 $3 … $n”输出形式一样$$脚本运行的当前ID号$!后台运行的最后一个进程的ID号$@与 $*相同,但是使用时加括号,引号中返回每个参数, “$1″”$2″…”$n”形式$-显示Shell使用的当前选项,与set命令功能相同$?显示最后命令的退出状态。0表示没有错误,其他任何值表示有错误

函数

函数定义

[ function ] funname [()]{    action;    [return int;]}
  • 可以带 functionfunc()定义,也可以直接 func()定义,不带任何参数。
  • 参数返回,可以显示加: return返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

函数返回值

  1. 无返回值函数#!/bin/bashfunc(){ echo “这是一个函数中的内容” }echo “开始调用函数”funcecho “调用函数完成”# 运行结果user@PxeCtrlSys:~$ http://www.toutiao.com/a6846609650809471501/test.sh 开始调用函数这是一个函数中的内容调用函数完成
  2. 有返回值函数#!/bin/bashfunc(){ echo “请输入两个数,执行加法” echo -n “请输入第一个数:” read num1 echo -n “请输入第二个数:” read num2 # return $[ $num1 + $num2] # 下方表达式也正确 return $(( $num1 + $num2 ))}echo “开始调用函数”funcecho “函数返回值为 $?”echo “调用函数完成”# 运行结果user@PxeCtrlSys:~$ http://www.toutiao.com/a6846609650809471501/test.sh 开始调用函数请输入两个数,执行加法请输入第一个数:2请输入第二个数:3函数返回值为 5调用函数完成所有函数在使用前必须定义。这就是说必须将函数放在脚本开始部分,直到shell解释器首次发现它时才可以使用。调用函数仅使用其函数名即可。

函数参数

#!/bin/bash
func(){    
  echo "第一个参数:$1"    
  echo "第二个参数:$2"    
  echo "第二个参数:${2}"    
  echo "第五个参数:$5"    
  echo "第10个参数:$10"  
  # 这个相当于第一个参数$1连接一个0    
  echo "第10个参数:${10}"    
  echo "第11个参数:$11"  # 相当于第一个参数$1连接一个1    
  echo "第11个参数:${11}"    
  echo "参数总数有 $# 个"    
  echo "传输出所有参数:$*"}
echo "开始调用函数"func 0 2 3 4 5 23 36 65 99 123
echo "函数返回值为 $?"
echo "调用函数完成"# 运行结果
user@PxeCtrlSys:~$ http://www.toutiao.com/a6846609650809471501/test.sh 开始调用函数第一个参数:0第二个参数:2第二个参数:2第五个参数:5第10个参数:00第10个参数:123第11个参数:01第11个参数:参数总数有 10 个作为一个地府传输出所有参数:0 2 3 4 5 23 36 65 99 123函数返回值为 0调用函数完成

参数处理说明$#传递到脚本的参数个数$*以一个单字符串显示所有向脚本传递的参数$$脚本运行的当前进程ID号$!后台运行的最后一个进程的ID号$@与$*相同,但是使用时加引号,并在引号中返回每个参数。$-显示Shell使用的当前选项,与set命令功能相同。$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

运算符

支持的运算符

  • 算术运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生bash不支持简单的数学运算,但可以使用其他命令实现,例如 awk、 expr(最常用)

expr是一款表达式计算工具,使用它完成表达式的求值操作

例如,两个数量价,注意是反引号,而不是单引号

#!/bin/bash
val=`expr 2+2`
echo "求值结果:$val"
val=`expr 2 + 2`
echo "求值结果:$val"# 运行结果user@PxeCtrlSys:~$ http://www.toutiao.com/a6846609650809471501/test.sh 求值结果:2+2求值结果:4

运算符说明 (例如a=2、b=3)举例+加法expr![a+](
https://math.jianshu.com/math?formula=a%20%2B)b 结果为 30。-减法expr![a-](
https://math.jianshu.com/math?formula=a%20-)b 结果为 -10。*乘法expr![a \\*](
https://math.jianshu.com/math?formula=a%20%5C%5C*)b 结果为 200。

  • 件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [$a==$b]
  • 乘号( *)前边必须加反斜杠( \*)才能实现乘法运算;
  • if…then…fi 是条件语句
  • 在 MAC 中 shell 的 expr 语法是: $((表达式)),此处表达式中的 “*” 不需要转义符号 “”
  • 数学计算命令

    Shell 中常用的六种数学计算方式

    运算操作符/运算命令说明
    ——————————————————————————-(())用于整数运算,效率很高,
    推荐使用。let用于整数运算,和 (()) 类似。[ $[]用于整数运算,不如 (()) 灵活。expr可用于整数运算,也可以处理字符串。比较麻烦,需要注意各种细节,不推荐使用。bcLinux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计算小数就得使用 bc 这个外部的计算器。declare-i将变量定义为整数,然后再进行数学运算时就不会被当做字符串了。功能有限,仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算、自增自减等,所以在实际开发中很少使用。

    创建别名

    alias 用来给命令创建一个别名。

    查看alias所有别名

    若直接输入该命令且不带任何参数,则列出当前 Shell 环境中使用了哪些别名

    user@PxeCtrlSys:~$ aliasalias ls='ls --color=auto'
    # 没有为ls创建别名root@StarMeow-Svr:~# alias
    root@StarMeow-Svr:~$ alias ls='ls --color=auto'
    root@StarMeow-Svr:~$ ls # 这儿的文件和文件夹就有颜色区分了

    使用 alias 当然也可以自定义别名,比如说一般的关机命令是 shutdown-h now,写起来比较长,这时可以重新定义一个关机命令,以后就方便多了。使用 alias 定义的别名命令也是支持 Tab 键补全的,如下所示:

    alias myShutdown='shutdown -h now'

    注意,这样定义别名只能在当前 Shell 环境中有效,换句话说,重新登录后这个别名就消失了。

    为了确保永远生效,可以将该别名手动写入到用户主目录中的 .bashrc文件。

    root@StarMeow-Svr:~$ vim /root/.bashrc 
    # 将下方代码取消被注释export LS_OPTIONS='--color=auto' eval "`dircolors`" alias ls='ls $LS_OPTIONS' alias ll='ls $LS_OPTIONS -l' alias l='ls $LS_OPTIONS -lA' 
    # 修改完后使其生效
    root@StarMeow-Svr:~# source ~/.bashrc 
    root@StarMeow-Svr:~# ls # 这儿的文件和文件夹就有颜色区分了
    root@StarMeow-Svr:~# alias
    alias l='ls $LS_OPTIONS -lA'
    alias ll='ls $LS_OPTIONS -l'
    alias ls='ls $LS_OPTIONS'

    删除alias别名

    使用 unalias 内建命令可以删除当前 Shell 环境中的别名。 unalias 有两种使用方法:

    • 第一种用法是在命令后跟上某个命令的别名,用于删除指定的别名。
    • 第二种用法是在命令后接 -a参数,删除当前 Shell 环境中所有的别名。

    同样,这两种方法都是在当前 Shell 环境中生效的。要想永久删除在 .bashrc文件中定义的别名,只能进入该文件手动删除。

    # 例如已经通过alias查到如下别名lsuser@PxeCtrlSys:~$ alias
    alias ls='ls --color=auto'# 使用unalias ls就可以删除当前环境的别名
    user@PxeCtrlSys:~$ unalias ls

    显示变量

    read命令从标准输入中读取一行,并把输入行的每个字段的值指定给shell变量

    #!/bin/bashread nameecho "You entered $name"# 运行结果
    user@PxeCtrlSys:~$ http://www.toutiao.com/a6846609650809471501/test.sh 66You entered 66

    显示换行:-e参数和\n

    #!/bin/bashecho -e "this is first line \n"echo "next"# 运行结果
    user@PxeCtrlSys:~$ http://www.toutiao.com/a6846609650809471501/test.sh this is first line next

    输出中 -e表示开启转义, \n表示换行

    显示不换行:-e参数和\c或-n参数

    #!/bin/bashecho -e "this is first line \c"echo "next"# 运行结果
    user@PxeCtrlSys:~$ http://www.toutiao.com/a6846609650809471501/test.sh this is first line next

    -e开启转义, \c表示不换行

    echo -n "this is first line"echo -n "next"# 运行结果this is first linenext

    输出结果重定向到文件

    #!/bin/bash
    echo -e "this is first line" > file.ts# 运行结果
    user@PxeCtrlSys:~$ http://www.toutiao.com/a6846609650809471501/test.sh user@PxeCtrlSys:~$ lsfile.ts software  test.shuser@PxeCtrlSys:~$ cat file.ts this is first line

    原样输出,不转义,不取变量

    直接使用单引号即可

    #!/bin/bash
    name='lr'echo '$name"\'# 运行结果
    user@PxeCtrlSys:~$ http://www.toutiao.com/a6846609650809471501/test.sh $name"\

    显示命令执行结果

    使用反引号,而不是单引号,可以执行Linux的命令

    #!/bin/bash
    echo `date`# 运行结果
    user@PxeCtrlSys:~$ http://www.toutiao.com/a6846609650809471501/test.sh Tue Mar 5 10:41:55 CST 2019

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
    转载请注明出处: https://daima100.com/30023.html

    (0)
    上一篇 2023-09-20 20:30
    下一篇 2023-09-21 10:30

    相关推荐

    发表回复

    您的电子邮箱地址不会被公开。 必填项已用*标注