ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

与shell相关的命令介绍

2022-01-19 18:59:49  阅读:155  来源: 互联网

标签:脚本 shell num 介绍 echo 命令 sh file MYSTR


1.case语句

#!/usr/bin/bash

echo "input passwd"
read line

case "$line" in
    [yY][eE][sS] | [yY] ) echo "this is yes";;
    no ) echo "this is no";;
    * ) echo "this is ***";;
esac

2.函数

#1.函数的基本形式,与C语言函数形式基本相同,但是没有返回值
#$?代表最后一行语句的执行结果是为真还是为假
fun()
{
    echo "fun run"
    echo "fun \$# = $#"
    echo "fun \$1 = $1"
    echo "fun \$2 = $2"    
    echo "$?"
}

#2.函数如何传参,$1,$2放在函数中就是传给函数的第一个参数和第二个参数,在函数外边就是传给脚本的参数
#注意:脚本中没有主函数
main()
{
    fun 123 abc
}

#3.脚本中的函数如何返回值
add()
{
    if [ "$#" -eq 0 ]
    then 
        return 0
    fi
    if [ "$#" -eq 1 ]
    then
        return $1
    fi

    x=$1
    y=$2
    num=`expr $x + $y`
    return $num
}    
#第一种方法,打印出返回值
add 2 3
echo "add=$?"
#第二种方式
add 2 3
a=$?
echo "add=$a"

#4.上边的例子中,在函数外边使用num也是可以的,在一行一行解释之后,解释器种有num,会一直存在,所以以下的打印方法也是可以的,如果在第一个num定义之后,在定义一个num,第二个num实际上也就是第一个num,对num的改变,改变的是第一个num,与C语言的语法是不一样的
echo "add=$num"

#5.为了解决像上边的问题(可能未发生重命名的问题),可以用以下的两种方法解决
#第一种方法,利用local,则str只在此函数中生效
mytest()
{
    local str="hello"
    echo "mytest::$str"
}
#第二种方法,利用unset,str在函数以外的地方就不可用了,也就是在解释器中将这个变量移除了
mytest()
{
    str="hello"
    echo "mytest::$str"
    unset str
}

3.脚本调用脚本

#脚本调用脚本
#方法:直接在一个脚本中写出另一个脚本的绝对路径或者相对路径
#假设有两个脚本文件 a.sh和b.sh

#在a.sh中,调用b脚本,相对路径的前提条件是两个脚本在同一个目录下,调用b脚本b是a的子进程
echo "a.sh run pid=$$"
MYSTR="hello"
echo "MYSTR=$MYSTR"
./b.sh

#执行a脚本,是否会打印出b脚本中MYSTR的值,答案是不会的
#因为两个脚本被不同的解释器执行,解释器的进程号都是不一样的
#在b.sh中
echo "b.sh run pid=$$"
echo "MYSTR=$MYSTR"

#要在b脚本中得到a脚本中MYSTR的值,有3种方法
#第1种方法,export将变量变成环境变量,在之后产生的子进程中都会继承环境变量
echo "a.sh run pid=$$"
MYSTR="hello"
export MYSTR
./b.sh

#第2中方法,将MYSTR这个参数当作参数传递给 b.sh
echo "a.sh run pid=$$"
MYSTR="hello"
./b.sh MYSTR
#在b.sh中
echo "b.sh run pid=$$"
echo "MYSTR=$1"

#第3种方法,以点命令去执行b脚本,意味要将b脚本放在a脚本的解释器种去执行,这两个脚本用的是同一个解释器
echo "a.sh run pid=$$"
MYSTR="hello"
. ./b.sh MYSTR
#sourse与上边的 . 等价
sourse ./b.sh MYSTR
#在b.sh中
echo "b.sh run pid=$$"
echo "MYSTR=$MYSTR"




4.C程序调用脚本

#a.sh中的程序如下
#!/usr/bin/bash
echo "a.sh run pid=$$"
echo "a.sh argc=$#"

scho "shell name:$0"
for arg in $*
do
    echo "arg=$arg"
    shift
done

exit 0

#C程序,里边去调用脚本,将C程序替换成了脚本解释器的bash进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
    printf("main pid=%d\n",getpid());
    execl("./a.sh","b.sh","aa","hello","123",(char*)0);
    perror("execl error");
}

#补充:在脚本调用C程序,直接在脚本中执行命令就行,例如:./main 或者 rm main.c,命令本身就是C程序

5.awk

功能:在文件中提取所需要的信息

适用情况

  1. 文件中每行内容的格式一致,比较像execl里边的二维数据,也像数据库中的表中的记录
  2. 第一列用$1表示,是第一个域,第二列用$2表示,是第二个域,以此类推,$0代表整行
  3. awk -F.  'print $1' file > file1     
  4. 上边的语句-F后边的.代表以.来划分域,'print $1'代表打印file文件域1的内容,写入到file文件中。如果以空格来划分域,-F+分割域符号不用写

6.sed

功能:sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。无论命令是什么,sed并不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有定向到一个文件,将输出到屏幕。

用法:

  1. sed ‘3i\aaaaaaa' file > newfile:对file文件进行操作,在第三行新插入一行插入aaaaaaa,插入后将内容存入newfile文件中
  2. sed ‘3a\aaaaaaa' file > newfile:对file文件进行操作,在第三行后面插入一行aaaaaaa,实际上是插入到第四行,插入后将内容存入newfile文件中
  3. sed ‘3,5i\aaaaaaa' file > newfile:对file文件进行操作,在第三和第五行后面插入一行aaaaaaa,实际上是插入到第四行,插入后将内容存入newfile文件中
  4. sed  -n ‘3,5i\aaaaaaa' file > newfile:将第三行至第五行的内容打印出

标签:脚本,shell,num,介绍,echo,命令,sh,file,MYSTR
来源: https://blog.csdn.net/m0_53101047/article/details/122478513

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有