i++循环
let s=0
for (( i=1; i<=100; i=i+1 )) //此处必须用双层括号
do
s=$(($s+$i))
done
echo "The count is $s" //此处必须用双层括号
# end
参考:https://www.cnblogs.com/itxdm/p/something_of_shellscirpt.html
https://www.cnblogs.com/hanggegege/p/5928870.html
https://blog.csdn.net/ztf312/article/details/52317571
简要描述:
1、单小括号( ):把括号内的命令在另一个shell执行,并把结果返回,左右不留空格,一般要带前缀 $
双小括号(( )) :整数比较、四则运算,括住的内容,完全符合C语言语法,一般要带前缀 $
2、单中括号[ ]:类似于测试命令(数字、字符串、文件三者的判断),左右必须留空格,特殊字符需用转义符\,一般用于if语句
双中括号[[ ]]:功能类似于单中括号,区别在于特殊字符无需转义,而且支持>、<等符号判断
3、单大括号{ }:快速替换
4、单反引号``:命令替换
一、小括号
1、单层小括号( ),执行shell命令并取得输出,例如:var=$(ls)、echo $(ls)
2、双层小括号(( )),内部可以
echo $((3+2)) 输出5 echo $((3>2)) 输出1 echo $((25<3 ? 2:3)) 输出3 echo $var echo $((var=2+3)) 输出5 echo $var echo $((var++)) 输出5,显然符合c语言特性 echo $var 输出6
二、中括号,[ ]、[[ ]]都类似于test命令,一般用于if语句。http://www.runoob.com/linux/linux-shell-test.html
单双中括号的共同点:
(1) 功能都是用于数字、字符串、文件三者的判断,字符串比较只能用==、!=、-z、-n,数字比较用-eq、-gt等,文件判断用-e -d等,取非用!,详情查阅test参考链接
(2) 两者左右两边都要留空格、运算符两边都要留空格!!!
两者的区别:
(1) 转义方面:若[ ]中出现特殊字符如( ),则左右小括号都要转义,写成\(\);而[[ ]]无需转义
(2) 判断运算符、逻辑运算符,分别支持哪些?(部分如下)
[ ]支持 | -eq | -gt | -ge | -a | -o |
[[ ]]支持 | ==和-eq | >和-gt | -ge、 不支持>= | && | || |
1、单中括号 [ ]
a=3
str="ab"
filePath=./hello.c #右值的单双引号可用可不用
if [ 3 -eq $a ]; then echo yes; fi #数字判断:输出yes
if [ $str!="cd" ]; then echo yes; fi #字符串判断:输出yes
if [ -e filePath ]; then echo yes; fi #文件判断:若存在则输出yes
2、双中括号[[ ]]
if [[ 3 > 2 && 3 < 2 ]]; then echo yes; fi #数字比较示例:输出yes
变量调用:
方法(1):${var}
方法(2):$var
命令调用:
方法(1):`COMMAND`
方法(2):$(COMMAND)
测试表达式:
方法(1):[ expression ]
方法(2):[[ expression ]]
方法(3):test expression
算术运算
方法(1):let 算术运算表达式
let C=$A+$B 这里变量A和B前面的$可以省略
方法(2):$[算术运算表达式]
C=$[$A+$B]
方法(3):$((算术运算表达式))
C=$(($A+$B)) #参考双( )的用法
方法(4):expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用,遇到乘法的*号还要转义
C=`expr $A + $B` #参考单反引号的用法
或C=$(expr $A + $B) #参考单( )的用法
方法(5):expr $[算术运算表达式],遇到乘法*号不用转义。
i++循环
let s=0
for (( i=1; i<=100; i=i+1 )) //此处必须用双层括号
do
s=$(($s+$i))
done
echo "The count is $s" //此处必须用双层括号
# end
单层括号$($s+$i)不管用必须必双层括号,但此处也可用[]代替双层括号shell中的变量,在使用的时候要加$,计算的时候也应加上,但在赋值=,read,export都不需要加变量(加了反而会报错)====================================关于比较表达式lt littler than <le littler or equal <=gt greater than >ge greater or equal >==================================int='expr 5 \* 6' expr表示进行算术运算echo $int
转载于:https://blog.51cto.com/bigfeetlee/494370
双层边框的信纸代码
代码:
<TABLE style="LEFT: -65px; WIDTH: 1000px; POSITION: relative; TOP: 0px" cellSpacing=0 cellPadding=0 align=center bgColor=#696969 border=0>
<TBODY>
<TR>
<TD>
<DIV>
<TABLE style="BACKGROUND-IMAGE: url(第一层最外面的细边框图片地址); WIDTH: 100%" cellSpacing=4 align=left>
<TBODY>
<TR>
<TD>
<P>
<TABLE style="BACKGROUND-IMAGE: url(第二层最外面的大边框图片地址); WIDTH: 100%" cellSpacing=120 align=left>
<TBODY>
<TR>
<TD>
<P>
<TABLE style="BACKGROUND-IMAGE: url(第三层中间的细边框图片地址); WIDTH: 100%" cellSpacing=5 align=left>
<TBODY>
<TR>
<TD>
<TABLE style="BACKGROUND-IMAGE: url(第四层中间的大边框图片地址); WIDTH: 100%" cellSpacing=70 align=left>
<TBODY>
<TR>
<TD>
<P></P>
<P align=center>
<TABLE style="BACKGROUND-IMAGE: url(第五层最里面的细边框图片地址); WIDTH: 100%" cellSpacing=5>
<TBODY>
<TR>
<TD>
<P align=left></P>
<P align=center></P>
<P align=left>
<TABLE style="BACKGROUND-IMAGE: url(http://1872.img.pp.sohu.com.cn/images/blog/2008/10/21/11/2/11dc515664eg215.jpg); WIDTH: 100%" cellSpacing=5>
<TBODY>
<TR></TR></TBODY></TABLE>
<TABLE style="BACKGROUND-IMAGE: url(日志背景图片地址); WIDTH: 100%" cellSpacing=1>
<TBODY>
<TR>
<TD>我详细解释如下:
1》七个url后面的括号是放你显示图片的背景地址
第一个URL括号后面是显示信纸的最外面边框图
第二个URL括号后面是显示信纸的最外面大边框图 (我放的是蝴蝶背景)
第三个URL括号后面是显示中间的细边框图
第四个URL括号后面是显示中间的大边框图
第五个UPL括号后面是显示最里面的细边框图
第六个URL括号后面不需要修改,没有意义,但也不能删除,否则不显示日志
第七个URL括号后面是显示日志背景的(我放的是黑色满天星星背景)
2 重点补充一下第二和第四是大图边框宽是可以调节的,请你找到(cellspacing=宽的单位)
只需要调节第二和第四URL后的
2》看见代码第1行没有?(由于我的网页有点错误,在这不能详细的给你们圈出来了,希望想要的朋友自己看下)
LEFT:-65px 指的是信纸使用发布时候在整个版面的位置距离左端多少位置
是可以更改的
WIDTH:1000px 指的是信纸整个版面显示的大小
是可以更改的
除了以上两个参数,其他的建议你们不要去更改,没有那个必要
路过的朋友觉得的不错的请鼓掌,你们的支持就是我前进的动力
题目:
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
超时(217 / 230 个通过测试用例)
/**
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
let len = s.length;
let start = 0;
let end = len;
let _result = 0;
while (start < len) {
while (end > start) {
if ((end - start + 1) % 2 && (end - start) > _result) {
let str = s.slice(start, end)
if (!match_str(str)) {
_result = Math.max(_result, end - start);
}
}
end--
}
start++
end = len;
}
return _result
function match_str(str) {
let i = 0;
while (i < str.length - 1) {
if (str[i] === '(' && str[i + 1] === ')') {
str = str.replace('()', '');
i = 0
} else {
i++
}
}
return str.length
}
};
( | ) | ( | ( | ) | ) | … | X | X |
---|---|---|---|---|---|---|---|---|
dp[0] | dp[1] | dp[2] | dp[3] | dp[4] | dp[5] | … | dp[i-1] | dp[i] |
0 | 2 | 0 | 0 | 2 | dp[5] | … | dp[i-1] | dp[i] |
求dp[5]:
匹配
匹配位置前一组匹配字符的长度与这次匹配的长度的和:
即:
如果5变成i的话则:
如果,则:
不匹配
那指针在该位置时得到的字符串是不满足条件的
取字符串指定位置字符可以使用’[]'也可以使用chartAt
边界处理:
/**
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
let len = s.length,
_result = 0;
if (len === 0) return _result
let dp = Array(len).fill(0);
for (let i = 1; i < s.length; i++) {
if (s.charAt(i) == ')') {
if (s.charAt(i - 1) == '(') {
dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
}
else if (
i - dp[i - 1] > 0 &&
s.charAt(i - dp[i - 1] - 1) == '('
) {
dp[i] = dp[i - 1] +
((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0)
+ 2;
}
_result = Math.max(_result, dp[i]);
}
}
return _result
};
规则被打断
循环
遇到’(’,其是起点的标记,存入
遇到’)’,找最近的那个’('与其匹配(从待匹配数组中去掉最后一个元素索引)
匹配字符从索引0开始,那么匹配0时他的起点为-1则,待匹配数组中默认存放-1
/**
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
let maxans = 0;
let stack = [-1];
for (let i = 0; i < s.length; i++) {
if (s.charAt(i) == '(') {
stack.push(i);
continue;
}
stack.pop();
if (!stack.length) {
stack.push(i);
} else {
maxans = Math.max(maxans, i - stack[stack.length - 1]);
}
}
return maxans;
};
先从左向右找其中:
再从右向左找其中:
返回记录的最大值
/**
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
let left = 0,
right = 0,
maxlength = 0;
for (let i = 0; i < s.length; i++) {
if (s.charAt(i) == '(') {
left++;
} else {
right++;
}
if (left == right) {
maxlength = Math.max(maxlength, 2 * right);
} else if (right > left) {
left = right = 0;
}
}
left = right = 0;
for (let i = s.length - 1; i >= 0; i--) {
if (s.charAt(i) == '(') {
left++;
} else {
right++;
}
if (left == right) {
maxlength = Math.max(maxlength, 2 * left);
} else if (left > right) {
left = right = 0;
}
}
return maxlength;
};
博客: 小书童博客
公号: 坑人的小书童