我今天在写一个 ssh 免密脚本,然后发现执行效率极低,换了种写法,发现一秒以内运行完成,添加提示信息发现了一个没想明白的情况,我提炼了具体情况,还请各位老哥解个惑
精简的代码贴上:
#!/bin/bash
declare -a EXTRAARG=("$@")
MySQLKeywords=(accessible account action add after against aggregate algorithm all alter always analyze and any as asc ascii asensitive at autoextend_size auto_increment avg avg_row_length backup before begin between bigint binary binlog bit blob block bool boolean both btree by byte cache call cascade cascaded case catalog_name chain change changed channel char character charset check checksum cipher class_origin client close coalesce code collate collation column columns column_format column_name comment commit committed compact completion component compressed compression concurrent condition connection consistent constraint constraint_catalog constraint_name constraint_schema contains context continue convert cpu create cross current current_date current_time current_timestamp current_user cursor cursor_name data database databases datafile date datetime day day_hour day_microsecond day_minute day_second deallocate dec decimal declare default default_auth definer delayed delay_key_write delete desc describe deterministic diagnostics directory disable discard disk distinct distinctrow div do double drop dual dumpfile duplicate dynamic each else elseif enable enclosed encryption end ends engine engines enum error errors escape escaped event events every except exchange execute exists exit expansion expire explain export extended extent_size false fast faults fetch fields file file_block_size filter first fixed float float4 float8 flush follows for force foreign format found from full fulltext general generated geometry geometrycollection get get_format global grant grants group group_replication handler hash having help high_priority host hosts hour hour_microsecond hour_minute hour_second identified if ignore ignore_server_ids import in index indexes infile initial_size inner inout insensitive insert insert_method install instance int int1 int2 int3 int4 int8 integer interval into invisible invoker io io_after_gtids io_before_gtids io_thread ipc is isolation issuer iterate join json key keys key_block_size kill language last leading leave leaves left less level like limit linear lines linestring list load local localtime localtimestamp lock locks logfile logs long longblob longtext loop low_priority master master_auto_position master_bind master_connect_retry master_delay master_heartbeat_period master_host master_log_file master_log_pos master_password master_port master_retry_count master_ssl master_ssl_ca master_ssl_capath master_ssl_cert master_ssl_cipher master_ssl_crl master_ssl_crlpath master_ssl_key master_ssl_verify_server_cert master_tls_version master_user match maxvalue max_connections_per_hour max_queries_per_hour max_rows max_size max_updates_per_hour max_user_connections medium mediumblob mediumint mediumtext memory merge message_text microsecond middleint migrate minute minute_microsecond minute_second min_rows mod mode modifies modify month multilinestring multipoint multipolygon mutex mysql_errno name names national natural nchar ndb ndbcluster never new next no nodegroup none not no_wait no_write_to_binlog null number numeric nvarchar offset on one only open optimize optimizer_costs option optionally options or order out outer outfile owner pack_keys page parser partial partition partitioning partitions password phase plugin plugins plugin_dir point polygon port precedes precision prepare preserve prev primary privileges procedure processlist profile profiles proxy purge quarter query quick range read reads read_only read_write real rebuild recover redo_buffer_size redundant references regexp relay relaylog relay_log_file relay_log_pos relay_thread release reload remove rename reorganize repair repeat repeatable replace replicate_do_db replicate_do_table replicate_ignore_db replicate_ignore_table replicate_rewrite_db replicate_wild_do_table replicate_wild_ignore_table replication require reset resignal restore restrict resume return returned_sqlstate returns reverse revoke right rlike rollback rollup rotate routine row_count row_format rtree savepoint schedule schema schemas schema_name second second_microsecond security select sensitive separator serial serializable server session set share show shutdown signal signed simple slave slow smallint snapshot socket some soname sounds source spatial specific sql sqlexception sqlstate sqlwarning sql_after_gtids sql_after_mts_gaps sql_before_gtids sql_big_result sql_buffer_result sql_calc_found_rows sql_no_cache sql_small_result sql_thread sql_tsi_day sql_tsi_hour sql_tsi_minute sql_tsi_month sql_tsi_quarter sql_tsi_second sql_tsi_week sql_tsi_year ssl stacked start starting starts stats_auto_recalc stats_persistent stats_sample_pages status stop storage stored straight_join string subclass_origin subject subpartition subpartitions super suspend swaps switches table tables tablespace table_checksum table_name temporary temptable terminated text than then time timestamp timestampadd timestampdiff tinyblob tinyint tinytext to trailing transaction trigger triggers true truncate type types uncommitted undefined undo undofile undo_buffer_size unicode uninstall union unique unknown unlock unsigned until update upgrade usage use user user_resources use_frm using utc_date utc_time utc_timestamp validation value values varbinary varchar varcharacter variables varying view virtual visible wait warnings week weight_string when where while with without work wrapper write x509 xa xid xml xor year year_month zerofill zone)
for GROUP_NAME in "${EXTRAARG[@]}";do
GROUP_NAME=$(echo "${GROUP_NAME}"|tr "[:upper:]" "[:lower:]")
# echo "tr 转换的数组元素: ${GROUP_NAME}"
# 0.7s 一个纯字母,一个字母中有一个冒号
if [[ "${GROUP_NAME}" =~ ":" ]]; then
GROUP_NAME1=$(echo "${GROUP_NAME}"|cut -d':' -f 1)
GROUP_NAME2=$(echo "${GROUP_NAME}"|cut -d':' -f 2)
if [ -n "$(echo "${GROUP_NAME}"|cut -d':' -f 3)" ];then
_error "非法字符: $(echo "${GROUP_NAME}"|cut -d':' -f 3)" && exit 1
else
for j in "${MySQLKeywords[@]}";do
if [ "${GROUP_NAME1}" = "$j" ] || [ "${GROUP_NAME2}" = "$j" ];then
_error "参数不能为 MySQL 的关键字或保留字!退出中" && exit 1
fi
done
fi
elif [[ ! "${GROUP_NAME}" =~ ":" ]]; then
for j in "${MySQLKeywords[@]}";do
if [ "${GROUP_NAME}" = "$j" ];then
_error "参数不能为 MySQL 的关键字或保留字!退出中" && exit 1
fi
done
fi
# 7s 一个纯字母,一个字母中有一个冒号
for j in "${MySQLKeywords[@]}";do
if [[ "${GROUP_NAME}" =~ ":" ]]; then
GROUP_NAME1=$(echo "${GROUP_NAME}"|cut -d':' -f 1)
GROUP_NAME2=$(echo "${GROUP_NAME}"|cut -d':' -f 2)
if [ -n "$(echo "${GROUP_NAME}"|cut -d':' -f 3)" ];then
_error "非法字符: $(echo "${GROUP_NAME}"|cut -d':' -f 3)" && exit 1
elif [ "${GROUP_NAME1}" = "$j" ] || [ "${GROUP_NAME2}" = "$j" ];then
_error "参数不能为 MySQL 的关键字或保留字!退出中" && exit 1
fi
elif [[ ! "${GROUP_NAME}" =~ ":" ]]; then
if [ "${GROUP_NAME}" = "$j" ];then
_error "参数不能为 MySQL 的关键字或保留字!退出中" && exit 1
fi
fi
done
done
用户给脚本提供两种格式的变量,一个是纯大小写字母,一个是字母中有一个英文冒号分隔符,但只能有一个冒号存在,即之后利用冒号进行变量字符的拆分的时候,最多只会拆成两个字符串。
我输入了两个变量:asdf 和 asd:f
后文加粗代表操作相同 简单来说,同样有外部遍历循环套着,区别在于:
采用循环内使用 if 进行分支判断
采用 if 进行分支判断后送入各自的循环
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.