热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linuxshell脚本入门

#!binbash#调试脚本#set-e#-e:出现错误即停止执行#sete#e:任何错误都继续执行#set-x#带表示shell输出,即自己写的

#!/bin/bash# 调试脚本
# set -e # -e: 出现错误即停止执行
# set +e # +e:任何错误都继续执行
# set -x # 带+表示shell输出,即自己写的代码;不带+表示程序输出# 变量
# 三种变量
# 局部变量,环境变量,shell变量(包含局部变量和环境变量)
your_name="黑胡椒" # =两边不能有空格!
echo $your_name
# 重新赋值
your_name="低调点"
echo "${your_name}"
# 删除变量
unset your_name
echo ${your_name} # 不存在不输出
# 常量
site="www.site.com"
echo "${site}"
readonly site
site="www.666.com"
echo site
# 字符串
str1='test' # 单引号不转义
str2="demo" # 双引号内部变量会被解析,可以转义
# 字符串拼接,使用空格隔开。
echo $str1 $str2
# 字符串长度
echo ${#str1}
# 字符串子字符串
echo ${str1:1:3}
# 数组,不支持多维数组,成员用空格隔开
arr=('a' '1' '啊')
# 所有成员
echo "${arr[@]}"
echo "${arr[*]}"
# 数组长度
echo "${#arr[@]}"
# 数组循环
for item in "${arr[@]}"; doecho "${item}"
done
# 数组取值
echo "${arr[1]}"
# 单行注释
:<<&#96;!&#96;
多行注释
&#96;!&#96;
:<<&#96;&#96;
多行注释
&#96;
&#96;
# 运算
# 1.关系运算符 -eq -ne -lt -gt -le -ge
# if
if [ 2 -gt 1 ]; thenecho &#39;2 > 1&#39;
elif [ 1 -gt 0 ]; thenecho &#39;1 > 0&#39;
elseecho &#39;default&#39;
fi
# 2.加减乘除&#xff0c;数字类型 &#96;
expr &#43; - * / % &#61;&#61; !&#61;&#96;
a&#61;1
b&#61;2
echo &#96;
expr 2 &#43; 2&#96; # 需要加空格
echo $[a&#43;b] # 下面两种都不需要加空格
echo $((a&#43;b)) # 使用这种写法$((express))来替代&#96;
expr express&#96;和$[express]
echo &#39;&#61;&#61;&#61;&#61;&#61;&#39;
# [[]] 和 (()) 分别是[ ]的针对数学比较表达式和字符串表达式的加强版。
# 条件语句的三种写法&#xff1a;
# if [[ $a !&#61; 1 && $a !&#61; 2 ]]
# 如果不适用双括号&#xff1a;if [ $a -ne 1] && [ $a !&#61; 2 ]
# 或者&#xff1a;if [ $a -ne 1 -a $a !&#61; 2 ]
# (())中还可以使用 v&#43;&#43;, v--, &#43;&#43;v, --v, ~v, v1**v2, v>>n, v<# 原码 用最高位表示符号位&#xff0c;‘1’表示负号&#xff0c;‘0’表示正号。其他位存放该数的二进制的绝对值。
# 1 原码 0000 0001
# -1 原码 1000 0001
# 反码 正数的反码还是等于原码&#xff0c;负数的反码就是他的原码除符号位外&#xff0c;按位取反。
# 1 反码 0000 0001
# -1 反码 1111 1110
# 补码 正数的补码等于他的原码&#xff0c;负数的补码等于反码&#43;1。
# 1 反码 0000 0001
# -1 反码 1111 1111echo $((a&#43;&#43;))
echo $((a--))
echo $((&#43;&#43;a))
echo $((--a))
echo ${a}
echo $((~a))
echo $((2**3))
echo $((a<<1))
echo $((b>>1))
echo $((a&b))
echo $((a|b))# 比较数字
if [ $a !&#61; $b ]
thenecho &#39;a !&#61; b&#39;
fi
b&#61;1
if [ $a &#61;&#61; $b ]
thenecho &#39;a &#61;&#61; b&#39;
fi
if [ &#96;
expr $a / $b&#96; ]
thenecho &#39;能够整除&#39;
fi
if [ &#96;
expr $a \* $b&#96; ]; thenecho &#96;expr $a \* $b&#96;
fi
# 3. 布尔运算 ! -o&#xff08;或&#xff09; -a&#xff08;并且&#xff09;
if [ 2 -gt 1 -o 0 -lt 1 ]; thenecho &#39;ok&#39;
fi
if [ &#96;
expr $a &#61;&#61; 1&#96; -a &#96;expr $a % $b&#96; -ge 0 ]
thenecho &#39;okk&#39;
fi
# 4. 逻辑运算符 && || 同 -o -a
a&#61;1
b&#61;2
if [[ ! ${a} -ne 1 && ${b} -gt 1 ]] # 里面需要加一层[]&#xff0c;并且和外层的[]之间不能有空格
thenecho &#39;取反&#39;
fi
# 5. 字符串运算符 &#61; !&#61; -z长度0返回true -n 长度不为0返回true
str&#61;&#39;&#39;
if [ -z "${str}" ]
thenecho &#39;为空&#39;
fi
str&#61;&#39;test&#39;
if [ -n "${str}" ]
thenecho &#39;不为空&#39;
fi# 6. 文件测试运算符
:<<&#96;
!&#96;-b file 块设备文件-c file 字符设备文件-d file 目录-f file 普通-p file 管道-r file 可读-w file 可写-x file 可执行-s file 文件是否不为空&#xff0c;大小为0-e file 文件或目录是否存在-S file 是否socket-L file 是否存在并且是一个符号链接
&#96;
!&#96;
file&#61;&#39;./base.sh&#39;
if [ -w $file ]
thenecho &#39;可读&#39;
fi
if [ -r $file ]
then echo &#39;可写&#39;
fi
if [ -x $file ]
then echo &#39;可执行&#39;
fi
if [ -L $file ]
thenecho &#39;存在并且是链接&#39;
fi
if [ -f $file ]
thenecho &#39;是文件&#39;
fi
dir&#61;&#39;../demo-shell&#39;
if [ -d $dir ]
then
echo &#39;是目录&#39;
fi
if [ ! -p $dir ]
then
echo &#39;不是管道&#39;
fi
if [ -s $file ]
thenecho &#39;文件不为空&#39;
fi
if [ -e $file ]
thenecho &#39;文件存在&#39;
fi
if [ -e $file -a -s $file -a -f $file ]
thenecho &#39;文件存在并且是内容不为空的普通文件&#39;
fi
# echo 命令
# 输出到文件
echo 111 > ./test.txt
# 输出命令
echo &#96;
date&#96;# print 漂亮格式&#xff08;略&#xff09;# test 数值&#xff0c;字符&#xff0c;文件测试&#xff08;略&#xff09;# if 分支不能为空略&#xff09;
# if语句经常和test语句结合使用# 控制流程语句
# for 循环
for((i&#61;0;i<3;i&#43;&#43;));
doecho $i
done
# for 集合循环
for item in {a..c}; doecho "${item}"
done
# while 语句
a&#61;3
while(($a >&#61; 1))
doecho $alet &#39;a--&#39;if [ $a -eq 0 ]then echo &#39;boom&#39;fi
done# while read who
# do
# echo "you like ${who}"
# done# case ... esac
# 每个 case 分支用右圆括号开始&#xff0c;用两个分号 ;; 表示 break&#xff0c;即执行结束。
:<<&#96;
&#96;
while :
doecho "输入1到4之间的数字:"read aNumecho "你输入的数字为&#xff1a;${aNum}"case $aNum in1) echo &#39;1&#39;;;2) echo &#39;2&#39;;;3) echo &#39;3&#39;;;4) echo &#39;4&#39;;;6|7|8) echo &#39;6/7/8&#39;;;9) echo &#39;你猜中了&#39;break # 跳出循环;;*) echo &#39;其他数字&#39;;;esac
done
&#96;
&#96;
for((i&#61;0;i<5;i&#43;&#43;)); doif [ &#96;
expr $i % 2&#96; -eq 0 ]thenecho "${i}"elsebreakfi
done# 文件引用
# source ./func.sh
# .func.sh
# . ./func.sh # 被包含文件不需要可执行权限# 输入/输出重定向# 输出重定向到file
echo &#39;hello&#39; > test.txt# 追加内容到文件
echo &#39;world&#39; >> test.txt# 输入重定向&#xff0c;读取文件行数
# echo "$(wc -l test.txt)" # 输出带了文件名
# echo "$(wc -l # 重定向输入&#xff0c;再重定向输出
wc -l < test.txt > lineNumber.txt # 2# 重定向错误信息
# echo 2> err.txt# 追加信息
# echo 2>> err.txt# 将输出和错误一起输出到文件
echo &#39;error info&#39; > err.txt 2>&1# Here Documentwc -l << EOFhelloworldshell
EOF
ls << EOF
-al
EOF
# 执行后丢弃到垃圾箱
echo &#39;ls -al&#39; > /dev/null# 丢弃错误信息
echo &#39;ls -al&#39; > /dev/null 2>&1# 总结
# ${x}&#xff1a;变量&#xff0c;${val}, ${arr[*]}
# ${#x}&#xff1a;长度&#xff0c;${#str},${#arr[&#64;]}
# 多行注释是<<&#xff0c;可以理解为不输出&#xff0c;&#96;
>&#96;为输出到...。
# if的elseif是写作elif, if [];后面的&#96;
then&#96;别忘了。
# &#96;
do... done&#96;代替&#96;{}&#96;&#96;,比如while() do...done, for() do...done
# 语句反写来代表结束&#xff0c;if...fi case...esac。
# case 中比较特殊&#xff0c;&#96;
;;&#96;替代&#96;break&#96;&#xff0c;&#96;)&#96;替代&#96;:&#96;
# if判断中&#xff0c;多个条件语句怎么写&#xff1f;&#96;
[[xx && xx]]&#96; &#96;[xx -a xx -o xx]&#96; &#96;[xx] && [xx]&#96;
# 数字比较可以使用&#61;&#61;, !&#61;。或者使用-eq -ne。没有<&#61;,>&#61;。需使用-ge,-le代替
# 使用$((express)),来获取表达式的结果作为变量使用。# 其他注意的地方&#xff1a;
# 1. 命令替换
# &#96;
ls /etc&#96; &#xff1a; 反引号 &#xff08;所有的unix系统都支持&#xff09;
# $(ls /etc) &#xff1a; $&#43;() &#xff08;部分unix系统不支持&#xff09;
# 多个嵌套使用时&#xff0c;从内向外执行。

fun.sh文件

#!/bin/bash
# 函数
# 所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分&#xff0c;
# 直至shell解释器首次发现它时&#xff0c;才可以使用。调用函数仅使用其函数名即可
# return 值只能是 [0-255] 范围
function add () {echo "请输入两个值来进行数字相加..."echo "输入第一个数字&#xff1a;"read aecho "输入第二个数字&#xff1a;"read breturn $(($a &#43; $b))
}# add
# echo "两个数字相加的值为&#xff1a;$?" # 调用函数后通过$?来获取# 仅对其上一条指令负责&#xff0c;一旦函数返回后其返回值没有立即保存入参数&#xff0c;那么其返回值将不再能通过 $? 获得。
echo "$?拿不到了" # $?为0&#xff0c;表示上一次执行的echo结果没有出错。每次输出&#xff08;echo/返回值也是输出&#xff09;的结果都会覆盖上次输出&#xff08;或者函数调用返回值&#xff09;的结果。function fnParam() {echo "第1个参数$1"echo "第2个参数$2"echo "第10个参数 $10 " # 变成拼接了echo "第10个参数${10}"echo "第11个参数${11}"echo "共有参数个数为&#xff1a;$#"echo "所有参数字符串输出&#xff1a;$*"echo "当前进程ID $$"echo "后台运行的最后一个进程ID $!"a&#61;$&#64;echo "所有参数: ${a}"echo "退出命令的状态$?" # 0表示没有出错&#xff0c;其他表示出错状态
}
fnParam 0 1 2 3 4 5 6 7 8 22 99
# 注意&#xff0c;$10 不能获取第十个参数&#xff0c;获取第十个参数需要${10}。当n>&#61;10时&#xff0c;需要使用${n}来获取参数。
b&#61;&#39;外部变量&#39;
function fnVal () {local b&#61;&#39;本地变量&#39;echo "${b}"
}
echo "\$b&#61;${b}"
fnVal


推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
author-avatar
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有