赞
踩
关注公众号 “融码一生”,领取全套 PDF / 电子书
- # root 用户登录看到的是:
- [root@VM-4-13-centos ~]#
-
- # 普通用户登录看到的是:
- [test1@VM-4-13-centos ~]$
command [选项] [参数]
[]
表示可选(可有可无)。有些命令不写选项和参数也能执行,有些命令在必要的时可以附带选项和参数。选项
:调整命令功能。如果没有选项,命令只能执行最基本的功能;有选项则能执行更多功能,或显示更丰富的数据。-
和一个字母表示,如ls -l
--
和一个单词表示,如ls --all
ls
命令的短格式选项-l
就没有对应的长格式选项。参数
:命令的操作对象,一般情况下,文件、目录、用户和进程等都可以作为参数被命令操作。如:ls -l main.c
ls
命令可以省略参数?因为有默认参数。命令一般都需要加入参数,用于指定命令操作的对象。如果省略参数,则一般都有默认参数。read
命令用来读取用户输入的数据,并把读取到的数据赋值给一个变量,通常的用法为:read str
str
:变量名read
命令增加-n
选项。比如读取一个字符作为性别的标志,可以这样写:read -n 1 sex
1
是-n
选项的值;-n
选项表示读取固定长度的字符串,它后面必然要跟一个数字用来指明长度,否则选项是不完整的sex
是read
命令的参数- echo $PATH
- :<<!
- /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
- !
:
分隔。- #include <stdio.h>
- #include <unistd.h>
- #include <getopt.h>
- #include <stdlib.h>
-
- int main(int argc, char *argv[]){
- int start = 0;
- int end = 0;
- int sum = 0;
- int opt;
- char *optstring = ":s:e:";
- while((opt = getopt(argc, argv, optstring))!= -1){
- switch(opt){
- case 's': start = atoi(optarg); break;
- case 'e': end = atoi(optarg); break;
- case ':': puts("Missing parameter"); exit(1);
- }
- }
-
- if(start<0 || end<=start){
- puts("Parameter error"); exit(2);
- }
-
- for(int i=start; i<=end; i++){
- sum+=i;
- }
- printf("%d\n", sum);
- return 0;
- }
~/bin
目录(~
表示用户主目录)下,然后在 Shell 中输入下面的命令,就可以计算 1+2+3 ...... +99+100 的值。- gcc getsum.c -o getsum -std=c99
- mkdir ~/bin
- mv getsum ~/bin
- # -s 选项表示起始数字, -e 选项表示终止数字
- getsum -s 1 -e 100
- :<<!
- 5050
- !
cd demo
:进入当前目录下的 demo 目录,demo
就是 cd 命令的参数echo "123xyz"
:输出字符串并换行,"123xyz"
就是 echo 命令的参数ls -l
:显示当前目录下的所有文件以及它们的详细信息;-l
就是ls
命令的选项echo -n "hello world"
:在输出字符串后不换行;-n
是 echo 命令的选项,"hello world"
是 echo 命令的参数getsum -s 1 -e 100
:计算从 1 累加到 100 的和;-s
和-e
是 getsum 命令的选项,1
和100
分别是-s
和-e
选项的参数read -n 1 sex
:读取一个字符并赋值给 sex 变量;-n
是 read 命令的选项,1
是-n
选项的参数,sex
是read
命令的参数int main(int argc, char *argv[])
,传递给应用程序的参数最终都被 main 函数接收了。从这个角度看,传递给应用程序的参数其实也是传递给了函数。getsum -s 1 -e 100
要向函数传递四个参数,read -n 1 sex
要向函数中传递三个参数。getsum -s 1 -e 100
要传递的四个参数分别是 -s、1、-e、100,减号-
也会一起传递过去;在函数内部,减号-
可以用来区分该参数是否是命令的选项。getsum
程序演示参数的解析:- #include <stdio.h>
- #include <unistd.h>
- #include <getopt.h>
- #include <stdlib.h>
- int main(int argc, char *argv[]){
- int start = 0;
- int end = 0;
- int sum = 0;
- int opt;
- char *optstring = ":s:e:";
- // 分析接收到的参数
- // getopt.h 头文件中的 getopt() 函数值得重点, 有了该函数就不用自己去解析参数;
- while((opt = getopt(argc, argv, optstring))!= -1){
- switch(opt){
- case 's': start = atoi(optarg); break;
- case 'e': end = atoi(optarg); break;
- case ':': puts("Missing parameter"); exit(1);
- }
- }
-
- // 检测参数是否有效
- if(start<0 || end<=start){
- puts("Parameter error"); exit(2);
- }
-
- // 打印接收到的参数(将接收到的参数打印出来, 以便读者更好地观察)
- printf("Received parameters: ");
- for(int i=0; i<argc; i++){
- printf("%s ", argv[i]);
- }
- printf("\n");
-
- // 计算累加的和
- for(int i=start; i<=end; i++){
- sum+=i;
- }
- printf("sum=%d\n", sum);
- return 0;
- }
- gcc getsum.c -o getsum -std=c99
- mkdir ~/bin
- mv getsum ~/bin
- getsum -s 1 -e 100
- :<<!
- Received parameters: getsum -s 1 -e 100
- sum=5050
- !
- # root 用户登录看到的是:
- [root@VM-4-13-centos ~]#
-
- # 普通用户登录看到的是:
- [test1@VM-4-13-centos ~]$
- [test1@VM-4-13-centos ~]$ cd demo
- [test1@VM-4-13-centos demo]$ cd /usr/local
- [test1@VM-4-13-centos local]$
-
-
- # 总结起来, Linux Shell 默认的命令提示符的格式为:
- [username@host directory]$
- [username@host directory]#
[]
:提示符的分隔符号,没有特殊含义test1
:当前登录的用户@
:分隔符号,没有特殊含义VM-4-13-centos
:当前系统的简写主机名~
:用户当前所在的目录为主目录(home 目录)/root/
,普通用户的主目录为/home/用户名/
bin
/usr/local/
,只显示最后一个目录local
)$
是命令提示符。Linux 用这个符号标识登录的用户权限等级#
$
>
:- [root@VM-4-13-centos ~]$ echo "Shell 教程"
- :<<!
- Shell 教程
- !
-
- [root@VM-4-13-centos ~]$ echo "
- > http://
- > baidu.com
- > "
- :<<!
- http://
- baidu.com
- !
>
用来告诉用户命令还没输入完成,请继续输入。" "
包围起来的字符序列,echo 将第一个"
作为字符串的开端,将第二个"
作为字符串的结尾。"
认为是不完整的字符串,所以会继续等待用户输入,直到遇见第二个"
。PS1
和PS2
这两个环境变量来控制提示符的格式,修改PS1
和PS2
的值就能修改命令提示符的格式。PS1
控制最外层的命令提示符格式PS2
控制第二层的命令提示符格式- [root@VM-4-13-centos ~]# echo $PS1
- :<<!
- [\u@\h \W]\$
- !
-
- [root@VM-4-13-centos ~]# echo $PS2
- :<<!
- >
- !
\
为前导的特殊字符来表示命令提示符中包含的要素,这使得PS1
和PS2
的格式看起来可能有点奇怪。PS1
和PS2
中使用的特殊字符: 字符 | 描述 |
\a | 铃声字符 |
\d | 格式为“日 月 年”的日期 |
\e | ASCII 转义字符 |
\h | 本地主机名 |
\H | 完全合格的限定域主机名 |
\j | shell 当前管理的作业数 |
\1 | shell 终端设备名的基本名称 |
\n | ASCII 换行字符 |
\r | ASCII 回车 |
\s | shell 的名称 |
\t | 格式为“小时:分钟:秒”的 24 小时制的当前时间 |
\T | 格式为“小时:分钟:秒”的 12 小时制的当前时间 |
\@ | 格式为 am/pm 的 12 小时制的当前时间 |
\u | 当前用户的用户名 |
\v | bash shell 的版本 |
\V | bash shell 的发布级别 |
\w | 当前工作目录 |
\W | 当前工作目录的基本名称 |
\! | 该命令的 bash shell 历史数 |
\# | 该命令的命令数量 |
\$ | 如果是普通用户,则为美元符号 |
\nnn | 对应于八进制值 nnn 的字符 |
\\ | 斜杠 |
\[ | 控制码序列的开头 |
\] | 控制码序列的结尾 |
\
开头,目的是与普通字符区分开。可以在命令提示符中使用以上任何特殊字符的组合。PS1
变量的值来修改命令提示符的格式:- [root@VM-4-13-centos ~]# PS1="[\t][\u]\$ "
- [15:06:32][root]$ PS1="[www.baidu.com]\$ "
- [www.baidu.com]$
关注公众号 “融码一生”,领取全套 PDF / 电子书
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。