shell编程中用户输入处理
1.命令行参数
2.脚本运行时获取输入

命令行参数 通过空格来进行分割的
位置参数 :$+position $0,$1,$2 ....
$0 :程序名
$1,$2,$3 ... $9
10及其以上的
${10}

add.sh

#/bin/bash
echo "file is $0"
echo "1->$1"
echo "2->$2"
echo "10->${10}"
echo "11->${11}"

./add.sh 1 2 3 4 5 6 7 8 9 10 11

file is ./add.sh
1->1
2->2
10->10
11->11

$0表示 命令行输入的

/root/sh/f.sh

#! /bin/bash
echo `basename $`
echo `dirname $`
[root@localhost110 sh]# /root/sh/f.sh
f.sh
/root/sh

calc.sh

#! /bin/bash

name=`basename $`

if [ $name = "add" ]
then
result=$[$+$]
elif [ $name="minus" ]
then
result=$[$-$]
fi
echo "the $name result is $result"

注意if 后的[]与变量之间必须有空格

chmod u+x calc.sh

ln -s calc.sh add
ln -s calc.sh minus

执行命令

./add 1 2
the add result is 3
 ./minus 5 1
the minus result is 4

命令行参数-特殊变量
1.参数计数(参数个数):$#
2.所有参数: $*
3.参数列表: $@

test.sh

#! /bin/bash

echo $#
echo $*
echo $@
echo "#######################"
for var in "$*"
do
echo "\$* param=$var"
done echo "########################" for var in "$@"
do
echo "\$@ param=$var"
done

执行结果

[root@localhost110 sh]# ./test.sh   js php

  js php
js php
#######################
$* param= js php
########################
$@ param=
$@ param=
$@ param=js
$@ param=php

$$

Shell本身的PID(ProcessID)

$!

Shell最后运行的后台Process的PID

$?

最后运行的命令的结束代码(返回值)

$-

使用Set命令设定的Flag一览

$*

所有参数列表 如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

$@

所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数

$#

添加到Shell的参数个数

 

$0

Shell本身的文件名

 

$~$n

Shell文件第1到第n个参数,大于9的用${n}

$?
成功返回0 否者返回大于0 的

[root@web ~]# ll
总用量
-rw-------. root root 7月 anaconda-ks.cfg
drwxr-xr-x. root root 3月 : c
..............................................
[root@web ~]# echo $? [root@web ~]# l
-bash: l: 未找到命令
[root@web ~]# echo $? [root@web ~]# echo 'php'|grep a
[root@web ~]# echo $? [root@web ~]# echo 'php'|grep h
php
[root@web ~]# echo $?

在/etc/profile里有这段代码

for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
[root@web sh]# echo $-
himBH

#表示从左到右匹配
## 表示从左到右匹配 贪婪匹配

[root@web sh]# a=.tar.gz
[root@web sh]# echo ${a#*.}
tar.gz
[root@web sh]# echo ${a##*.}
gz

对于一个普通的文件

echo ${-#*/root/sh/until.sh}

himBH
表示从左到右去掉**/root/sh/until.sh 匹配到的内容
$-记录着当前设置的shell选项,himBH是默认值,可以通过 set 命令来设置或者取消一个选项配置

[root@web sh]# set -x
[root@web sh]# echo $-
+ echo himxBH
himxBH

x表示shell的调试开关 ,和sh -x 方式执行shell脚本等同
多了x选项
set -o 或者set +o 查看所有选项

[root@web sh]# set -o
allexport off
braceexpand on
emacs on
errexit off
errtrace off
functrace off
hashall on
histexpand on
history on
ignoreeof off
interactive-comments on
keyword off
monitor on
noclobber off
noexec off
noglob off
nolog off
notify off
nounset off
onecmd off
physical off
pipefail off
posix off
privileged off
verbose off
vi off
xtrace off
[root@web sh]# set +o
set +o allexport
set -o braceexpand
set -o emacs
set +o errexit
set +o errtrace
set +o functrace
set -o hashall
set -o histexpand
set -o history
set +o ignoreeof
set -o interactive-comments
set +o keyword
set -o monitor
set +o noclobber
set +o noexec
set +o noglob
set +o nolog
set +o notify
set +o nounset
set +o onecmd
set +o physical
set +o pipefail
set +o posix
set +o privileged
set +o verbose
set +o vi
set +o xtrace

-表示打开的选项
查看打开的选项

[root@web sh]# set -o|awk '$2=="on" {print $1}'
braceexpand
emacs
hashall
histexpand
history
interactive-comments
monitor
或者
[root@web sh]# set +o|awk '$2=="-o" {print $3}'
braceexpand
emacs
hashall
histexpand
history
interactive-comments
monitor

i - interactive
包含这个选项说明当前的 shell 是一个交互式的 shell,何为交互式
你输入命令,shell 解释执行后给你返回结果,我们在 Terminal 下使用的 shell 就是交互式的
所以 $- 会包含 i 字符
如果我们在一个脚本里面 echo $-,结果是不会包含 i 的

[root@web sh]# cat tmp.sh
#! /bin/bash
echo $-;
[root@web sh]# sh tmp.sh
hB
[root@web sh]# echo $-
himBH

H - history

这个很多人都基本上不用, Shell 会把我们执行的命令记录下来,可以通过 history 命令查看,每一行是序号 + 执行的命令。
在 shell 退出时,会将这些信息保存到~/.bash_history 文件中,当然在启动时也会从该文件中加载,不信删除这个文件再打开一个终端试试。
history 就是展开历史列表中的命令,可以通过!感叹号来完成,例如"!!"返回上最近的一个历史命令,"!n"返回第 n 个历史命令
set +o history
关闭了history后history里不会再有新内容了

B - braceexpansion
Braceexpansion 是一个很有用的技巧 cp或者mv时
[root@web sh]# cp add.sh{,.20170316}

会自动备份 add.sh.20170316
可以通过set +B来关闭这个功能,与前面几个选项不同的是,这个选项在脚本里面也是默认打开的

m - monitor
字面意思是说打开监控模式,Bash 手册上后面还有一句话"Job control is enabled",Job control 是什么?就是说可以控制进程的停止、继续,后台或者前台执行等。
正常情况下,在交互式模式下,该选项默认是打开的,所以再执行一个比较耗时的命令时,
你可以按下CTRL+Z 让它在后台运行,然后可以用 fg 命令将后台运行的任务恢复到前台执行

[root@web sh]# sleep
^Z
[]+ 已停止 sleep
[root@web sh]# jobs
[]+ 已停止 sleep
[root@web sh]# fg
sleep
h - hashall
打开这个选项后,Shell 会将命令所在的路径记录下来,避免每次都要查询
在/usr/bin 下创建任意一个可执行的文件:
[root@web sh]# cat /usr/bin/hk
#! /bin/bash
echo $
[root@web sh]# chmod u+x /usr/bin/hk
[root@web sh]# hk
/usr/bin/hk
[root@web sh]# mv /usr/bin/hk ~/sh
[root@web sh]# hk
-bash: /usr/bin/hk: 没有那个文件或目录

shell编程中用户输入处理(shell 04)的更多相关文章

  1. Linux - 简明Shell编程13 - 用户输入(UserInput)

    脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 1 - arguments #!/bin/bash i ...

  2. shell编程中变量的运算 (shell 06)

    主要包括以下3种 字符串操作数学运算浮点运算 一.字符串操作 字符串的连接 连接字2个字符串不需要任何连接符,挨着写即可 长度获取 expr length "hello" expr ...

  3. Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载

    Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载   这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数 ...

  4. Shell编程中Shift的用法

    Shell编程中Shift的用法 位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shif ...

  5. Shell编程中while与for的区别及用法详解【转】

    在shell编程中经常用到循环,常用的循环有for和while循环两种.while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别. 一.常用 ...

  6. Shell编程中Shift的用法【转】

    本文转载自:http://www.cnblogs.com/image-eye/archive/2011/08/20/2147153.html Shell编程中Shift的用法 位置参数可以用shift ...

  7. Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||

    https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...

  8. shell编程中的if语句

    if语句在任何编程中都是必不可少.至关重要的分支语句,shell也是如此,只不过各种编程中的方式和格式有点不太一样 shell编程中的if语句基本格式如下: if [ X$1 = XA ];then ...

  9. shell编程中如何执行oracle语句

    shell编程中如果向oracle中插入数据之类的,需要先把执行语句放到文件中,然后再@这个文件执行 有如下俩种方式供参考: SQL=`sqlplus user/pwd@orains << ...

随机推荐

  1. maven项目Dao层优化

    平时我们习惯一个实体类就对应一个dao类,这样做,增删改查都大同小异,只是实体类对象不一样而已,因此,我们可以把公用的方法抽取来,建立一个IBaseDao接口,如下: public interface ...

  2. 自己用java实现飞鸽传书 1 - 实现socket通信

    第一步: 建立服务端客户端,实现端到端通信.因为要传递文件,信号量较大,故使用TCP/IP协议. 服务端和客户端都要建立socket,而后通过socket进行通信.目前只实现服务端到客户端的单向通信. ...

  3. Java多线程 - 控制线程

    join线程 在某个线程的执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的线程完成为止. join()方法有三种重载形式: join():等待被join的线程执 ...

  4. Eclipse2013_文件编码设置

    1. Eclipse --> Window --> Preferences --> General --> Workspace 其中的 "Text file enco ...

  5. LeetCode第[56]题(Java):Merge Intervals

    题目:合并区间 难度:Medium 题目内容:   Given a collection of intervals, merge all overlapping intervals. 翻译: 给定一个 ...

  6. yii2:不使用composer安装yii2-jui的方法

    今天有一个功能需要用到autocomplete,既然用yii2开发,在这里当然使用它自带的yii2-jui中的autocomplete组件了.yii2basic版默认是没有yii2-jui组件的,需要 ...

  7. vue 时间格式化

    export function formatDate(date, fmt) { if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.g ...

  8. Python globals() locals() vars() 三个内建函数的区别

    首先参考官方文档对这三个函数的介绍: 2. Built-in Functions – Python3.5 1.globals() 返回当前全局符号表, 通常是返回当前模块下的全局符号表, 比如全局内建 ...

  9. ASP.NET学习路线图(转)

    如果你已经有较多的面向对象开发经验,跳过以下这两步: 第一步 掌握一门.NET面向对象语言,C#或VB.NET 我强烈反对在没系统学过一门面向对象(OO)语言的前提下去学ASP.NET. ASP.NE ...

  10. WMS专业名词解释

    1.摘果:按照单一客户上订单的内容进行拣选货品(即去货位上拣货),拣选完成后即可直接进行质检.包装. 2.播种:将多个客户订单上的货品进行汇总,然后对这些货品进行拣选.拣选完成后,再区分出每一个客户的 ...